对const的引用(常量引用)
引用的类型必须与其所引用对象的类型一致.但是,对const的引用是第一种例外情况.
对const的引用,常简称为"常量引用". 常量引用的初始值可以是任意表达式,只要该表达式的结果能转换成引用的类型即可.
但是,对于字面值,一般表达式以及与常量引用类型不一致的对象作为常量引用的初始值,常量引用实际绑定到了临时变量上.测试代码如下:
1 #include <iostream>
2
3 int main()
4 {
5 int i = 42;
6 int &r1 = i;
7
8 const int &r2 = i;
9 std::cout << "r2 = " << r2 << std::endl;
10 r1 = 40;
11 std::cout << "r2 = " << r2 << std::endl;//测试r2是否改变.
12
13 const int &r3 = i * 2;
14 std::cout << "r3 = " << r3 << std::endl;
15 r1 = 30;
16 std::cout << "r3 = " << r3 << " i = " << i << std::endl;//测试r3是否改变.
17
18 std::cout << "Double===========================" << std::endl;//测试r3是否改变.
19
20 double val = 3.14;
21 const int &r4 = val;
22 std::cout << "r4 = " << r4 << std::endl;
23 val = 5.2;
24 std::cout << "r4 = " << r4 << " val = " << val << std::endl;//测试r4是否改变.
25
26
27 double val_2 = 2.1;
28 const double &r5 = val_2 * 2;
29 std::cout << "r5 = " << r5 << std::endl;
30 val_2 = 9.35;
31 std::cout << "r5 = " << r5 << " val_2 = " << val_2 << std::endl;//测试r5是否改变.
32
33
34
35 const int val_3 = 3;
36 const double &r6 = val_3;
37 std::cout << "r6 = " << r6 << " val_3 = " << val_3 << std::endl;//测试r6是否改变.
38
39 return 0;
40 }
运行结果如下:
可以看出对于一般表达式,常量引用绑定到临时变量上.对于上述最后一种情况,分析r6也只能绑定到临时量上.
最后总结一下.常量引用只有2种情况会绑定到实际的对象:一是常量引用的初始值为const对象,且该对象类型与常量引用类型相同(如const int i ; const int &r = i;);二是常量引用的初始值为非const对象,且该对象也与常量引用类型(除去const的类型)相同(如int i; const int &r = i;).测试代码中,r2的情况即是如此.这种情况下,绑定的非const对象内容可以用其他普通引用改变.
不是尽力而为,而是全力以赴.