目录
引用概念
定义引用类型
引用特性
常引用
传引用传参
传引用做返回值
1.引用概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:鲁迅与周树人,他们是同一个人,两个名字
2.定义引用类型
注意!!引用类型必须和引用实体是同种类型的。
同时,这里还存在符号多用的情况:&在其他地方是取地址,在这里就是:
类型&引用变量名(对象名)=引用实体
void TestRef() { int a = 10; int& ra = a;//<====定义引用类型 printf("%p\n", &a); printf("%p\n", &ra); }
3.引用特性
引用在定义时必须初始化,比如 int& ra;这条语句是错的,有别名,但是不知道是谁的名字
一个变量可以有多个引用
引用一旦引用一个实体,再不能引用其他实体
下面是一个变量有多个引用的情况(有多个别名,但都指的是同一块空间)
int main() { int a=0; int&b=a; int&c=a; int&d=a; return 0; }
一旦引用,就不能改变指向,但可以赋值,b改变a也会同时改变。
4.常引用
所谓常引用,就是在声明引用变量时,在类型前加上const关键字,表示该引用所引用的对象的值不能被修改。
在引用的过程中,会涉及到权限的放大,缩小,平移的问题。
权限可以平移,缩小,但不能放大。
const相当于是一种限制
下面更复杂的情况,这种情况是可以的。为什么呢?
在下面的过程中,会产生临时变量,I的值通过转换成int型,放到临时变量中去,再把临时变量的值拷贝给d,而临时变量具有常性,这里会存在一个权限的放大,加了const之后,就又会对权限有缩小,就可以了,如上图。
注意!单纯的值拷贝没有权限的放大。这里存在类型的转换,所以会产生临时变量。
下面也是类似情况,引用出现了权限的放大。
函数调用中的返回值也是放在一个临时变量中的,这个临时变量可能存在于寄存器中,也可能在栈中预先分配的一段空间中。
这个时候在前面加一个const就好了。
5. 传引用传参(任何时候都可以用)
下面left与right的改变会直接改变a,b。
引用传参与传值传参的对比,下面的代码是单链表的插入与修改的相关代码
传值传参
传引用传参
明显代码会简单一些
6.引用做返回值(出了函数作用域对象还在可以用)
与传值做返回值对比,引用做返回值明显效率更高。
但是像下面这种情况就不可以
n的作用域只在Count函数中,出了作用域n都销毁了,还返回他的别名,这个是不合法。