[C++]引用
1. 什么是变量的引用对一个数据可以建立一个“引用”它的作用是为一个变量起一个别名变量和它的引用共用同一块空间。是C对C的一个重要扩充。2. 引用的使用2.1. 使用方法数据类型 引用变量名(对象名) 引用实体假如我们有一个整形的变量a我们想给它起一个别名b#includeiostreamusingnamespacestd;intmain(){inta10;//定义a是整形变量intba;//声明b是对a的引用couta aendl;coutb bendl;couta aendl;coutb bendl;return0;}运行结果a 10 b 10 a 00BFFABC b 00BFFABC以上声明了b是a的引用即b是a的别名。a和b都指向同一块内存空间操作b相当于操作a。注意在上述声明中是引用声明符并不代表地址不要理解成了把a的地址赋值给了b。在数据类型名后出现是引用声明符在其他场合出现的就是取地址符。2.2. 引用的特性声明一个引用时必须同时使之初始化即声明其指向哪一个变量。一个变量可以有多个它的引用。声明引用后不能不能再改变其引用的实体对象即无法成为其他对象的引用。引用不是一种独立的数据类型。对引用只有声明没有定义。不能建立数组的引用。如intarr[5];intra[5]arr;//错误不能引用数组intrbarr[0];//错误不能建立数组元素的引用。不能建立引用的引用。2.3. 引用的本质上面程序中声明了b是对a的引用实际上在内存中给b分配了一个指针指向a当我们操作a的别名b时就相当于操作b指向的内存空间中a的值 相当于*pb。引用的本质就是一个const修饰了指针指向的指针不能改变其指向。引用能实现的功能都可以通过指针来实现但是指针能实现的功能引用不全都能实现。 由于引用具有方便易理解的特点可以不用直接操纵指针变量将其作为实体变量的“别名”来解释因此使用引用可以提高程序代码的可读性。3. 常引用3.1. 使用方法代码例子//常引用intmain(){constinta10;//int ra a; //错误因为a是常量不能被修改这样做是放大对a的权限constintraa;//const修饰的引用不能修改其值coutra raendl;intb20;constintrbb;//合法引用的权限可以被缩小coutrb rbendl;b10;coutrb rbendl;return0;}运行结果:ra 10 rb 20 rb 10对常量的引用需要加上const修饰不然会存在权限的放大的问题。声明对常量a的const修饰的引用ra这样ra只能使用其引用的常量a的值而不能修改其值。3.2. 注意事项我们再来看下面的代码#includeiostreamusingnamespacestd;intmain(){constinta10;couta aendl;doubleb3.14;constintrbb;coutb b ;coutrb rbendl;b6.28;coutb b ;coutrb rbendl;return0;}运行结果a 10 b 3.14 rb 3 b 6.28 rb 3我们看到我们将const int a初始化为常量10 其指向存储常量10的内存空间这段内存空间存储数据类型是const inta是常量10的别名这很好理解。但是为什么下面可以用double类型的b变量初始化不同类型的const int rb呢因为创建一个对const int的引用rb并将它绑定到double类型的变量b上。编译器会进行隐式类型转换通常称为类型提升将double类型的b转换为int类型并将这个转换后的值存储在rb所引用的某个临时的const int对象中。注意因为是const引用所以不能通过这个引用去修改那个临时的 int 对象。 其引用的对象已经不是double类型的变量b了rb不是b的别名而是某个在类型转化过程中所创建的用来保存转化结果的某个临时的const int的对象也叫做将亡值右值的别名 所以修改b的值不能导致rb的值变化这个例子值得我们注意。4. 引用的具体使用场景4.1. 作为函数参数#includeiostreamusingnamespacestd;//引用的具体使用场景voidMySwap(intx1,intx2)//这里传入对两个整形变量的引用{inttempx1;x1x2;x2temp;}intmain(){inta10;intb20;couta a b bendl;MySwap(a,b);//这里直接传入a和b变量而不需要对其取地址couta a b bendl;return0;}运行结果a 10 b 20 a 20 b 10这里的MySwap函数交换两个整形时就可以不用像C语言一样传入两个整型变量的指针来交换他们的值了可以直接传入变量名对其进行引用。4.2. 作为返回值#includeiostreamusingnamespacestd;//作为返回值intCount(){staticintcount0;count;returncount;}intmain(){intcCount();//c是静态变量count的别名c0;//将静态变量count重新设置为0进行计数for(inti0;i10;i)//执行十次Count函数Count();coutc cendl;//将c设置为30再进行计数c30;for(inti0;i10;i)//再执行十次Count函数Count();coutc cendl;return0;}运行结果c 10 c 404.3. 引用对象引用不仅可以用于变量也可以用于类对象。例如实参可以是一个类对象名的引用在C面向对象的程序设计中经常用到引用。