C++中引用详解

来源:互联网 发布:微信公众号授权域名 编辑:程序博客网 时间:2024/06/05 04:44

C++中引入了引用这个复合类型,上一篇我写了关于引用和指针的区别,在这篇中我总结一个有关引用的需要注意的地方。
1.引用不会产生新的变量,而是给变量起了一个别名
编译器不会给引用变量开辟新的空间,如果对引用传值的语句进行反汇编查看,可以看出,编译器在底层进行引用处理的时候,跟指针处理是一样的,即引用变量与引用变量绑定的变量的地址相同。
2.引用变量不是一个对象
引用变量仅仅是实体的一个别名,并不是一个对象,所以对对象的操作,对引用变量不能做。
比如,不能定义引用的引用。
因为引用绑定的实体一定是一个变量,但是引用变量并不是一个对象,我们没有办法绑定一个引用变量作为实体,所以不能定义引用的引用。
3.引用再定义的时候必须初始化
引用在定义的时候就必须绑定一个实体,编译器才能给引用变量赋值,不然引用变量在接下来的作用周期中都不能再改变自己的值了,这个时候在给引用变量绑定实体,肯定是错误的。所以引用在定义的时候就必须初始化。
4.引用一旦绑定一个实体,就不能成为别的变量的引用
引用是变量的别名,所以一旦引用绑定了一个实体,如果要再次改变引用实体,就会报错
5.引用前必须要有类型
在定义引用变量时,如果前面没有类型,编译器无法识别到底是引用变量的定义还是&取地址符号,所以必须要有类型

int &j = i; //引用&j = i;     //取地址?引用?无法分清,错误

6.引用绑定常量时,前面要加const

int &j = 10;        //错误const int &j = 10;  //正确

7.不同类型之间引用的定义
在C++中不同类型变量之间的赋值,会产生临时变量,如果在引用定义时,实体与引用变量的类型不同,则会产生问题,因为临时变量具有常量属性,即现在其实是把临时变量的值给了引用,就到了上面第六条的问题

double f1 = 12.34;int &i = f1;    //  错误
double f1 = 12.34;const int &i = f1;//正确,把引用变量变成常量,即可以跟临时变量绑定

8.对指针变量进行引用

int *p = &a;int &q = p;//p = q = &a;//&p = &q;

9.对数组进行引用
对数组进行引用的格式一定要写对

int a[5] = {0};int (&arr)[5] = a;

10.关于指针和引用的区别
上一篇有,大家去那一篇看看
11.关于传值和传引用的区别
1.传值对产生临时变量,但是传引用因为相当于传的是地址,所以不会产生临时变量
2.如果在传引用时不想改变实参,要加const
3.引用传值和指针传值没有区别
他们代码的反汇编的实现是一样的,都是传址
12.注意!不要返回栈空间上的引用!

0 0
原创粉丝点击