对const的引用(常量引用)

  引用的类型必须与其所引用对象的类型一致.可是,对const的引用是第一种例外状况.ios

  对const的引用,常简称为"常量引用". 常量引用的初始值能够是任意表达式,只要该表达式的结果能转换成引用的类型便可.测试

  可是,对于字面值,通常表达式以及与常量引用类型不一致的对象做为常量引用的初始值,常量引用实际绑定到了临时变量上.测试代码以下:spa

 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 }

  运行结果以下:code

 

  能够看出对于通常表达式,常量引用绑定到临时变量上.对于上述最后一种状况,分析r6也只能绑定到临时量上.对象

    最后总结一下.常量引用只有2种状况会绑定到实际的对象:一是常量引用的初始值为const对象,且该对象类型与常量引用类型相同(如const int i ; const int &r = i;);二是常量引用的初始值为非const对象,且该对象也与常量引用类型(除去const的类型)相同(如int i; const int &r = i;).测试代码中,r2的状况便是如此.这种状况下,绑定的非const对象内容能够用其余普通引用改变.    blog

相关文章
相关标签/搜索