const的引用

时间:2023-03-09 08:01:13
const的引用

const的引用

对常量的引用:把引用绑定到const对象上,就像绑定到其他对象上一样,不能被用作修改它所绑定的对象:

const int ci = ;
const int &r1 = ci;//正确:引用及其对应的对象都是常量
r1 = ;//错误:r1是对常量的引用
int &r2 = ci;//错误:试图让一个非常量引用绑定一个常量

因为不允许直接为ci赋值,所以也就不能通过引用去改变ci。

初始化和对const的引用

在初始化常量引用时允许任意表达式作为初始值,只要该表达式的结果能转换成引用的类型,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:

int i = ;
const int &r1 = i;//允许const int&绑定到一个普通int对象上
const int &r2 = ;//正确:r1是一个常量引用
const int &r3 = r1 * ;//正确:r3是一个常量引用
int &r4 = r1 * ;//错误:r4是一个非常量引用

当一个常量引用被绑定到另外一种类型上:

double dval = 3.14;
const int &ri = dval;

ri引用了一个int型的数,对ri的操作应该是整数运算,但dval却是一个双精度浮点数而非整数,为了确保让ri绑定一个整数,编译器把上述代码变成如下形式:

const int temp = dval;//由双精度浮点数生成一个临时的整型常量
const int &ri = temp;//让ri绑定这个临时常量

临时量对象:当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象。

对const的引用可能引用一个并非const的对象

常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定:

int i = ;
int &r1 = i;//引用ri绑定对象i
const int &r2 = i;//r2也绑定对象i,但是不允许通过r2修改i的值
r1 = ;//r1并非常量,i的值修改为0
r2 = ;//错误:r2时一个常量引用