C++之引用
1.引用的基本概念
引用(reference)为对象起了另一个名字,一般在初始化变量时,初始值会被拷贝对象中,而在定义引用时,程序将引用和其初始值(bind)绑定在一起,而不是将初始值拷贝给引用,一旦初始化完成,这种绑定一直维持,不能解除当前绑定和其他对象绑定。引用定义方式如下:
1 int Val=100;
2 int &a=Val;//将a与Val绑定
3 int &b;//错误:引用必须被初始化
4 int &c=1;//错误:引用类型的初始值必须为一个对象
5 double dVal=0.1;
6 int &d=dVal;//错误:类型不匹配
注意:引用只是对象的别名,引用并不是对象,所以对对象的一些操作对引用都无效,没有指向引用的指针,没有引用类型数组,没有引用的引用!
2.const 和引用
可以将引用和const对象绑定在一起,成为对常量的引用,不能通过引用对常量进行跟改。
1 const int a=1; 2 const int &b=a; 3 int &c=a;//错误:试图以非常量引用指向常量
2.1初始化和对const的引用
引用类型必须与其所引用的对象一致,但是存在两个例外,一是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式能转化成相应的引用类型即可:
1 int i=42; 2 const int &r1=i;//允许将const引用绑定到普通int对象上 3 const int &r2=r1;//正确:r1为常量引用 4 const int &r3=r1*2;//正确:r3是常量引用 5 int &r4=r1*2;//错误
要理解上述代码为什么可行,就需要理解当一个常量引用绑定到另一个类型对象上时发生了什么:
1 double dval=3.14; 2 const int &ri=dval;
此处试图使用int型引用指向double类型,难么编译器为了实现类型匹配,有下面的操作:
1 const int temp=3.14; 2 const int &ri=temp;//temp为一个临时量
很明显ri指向了一个const int型临时量,临时量是当编译器需要一个空间来暂存表达式求值结果临时创建的一个未命名的对象,我们不想对一个临时量进行操作,这种操作也是没有意义的,C++将这种行为归为非法。
2.2 对const的引用可能引用一个非const对象
const存在顶层const和底层const的说法,这个以后单独再些一篇博客吧!就对于引用而言,下面的代码是正确的:
1 int i=10; 2 const int &ri=i;
上面并没有报类型不匹配的错误,原因在于普通对象我认为将其看做const对象是没问题的,反之则不行。这里便体现出了顶层const,虽然i不是const int类型,但使用const int型引用指向它,代表我们不能通过ri这个引用去修改i的值,但是我们通过i来直接修改,const 引用限定了引用的行为。
3 在函数中尽量使用引用传参
函数有三种传参方式,按值传递、按引用传递和指针传递三种方式,使用按值传递存在额外的对象的构造、拷贝和析构的过程,使用指针或者引用传递的效率要更高,为了禁止函数中对指向对象的更改可以使用cosnt限定。
posted on 2017-08-24 10:49 CodeBeauty 阅读(183) 评论(0) 编辑 收藏 举报