spider

导航

 


// 代码段  1 
double a = 1.5;
const int & b = a; //必须有const不然报错
a = 2.5;
cout << a << " " <<b<< endl; // 输出 a = 2.5 b = 1;

 

// 代码段  2
int c= 2;
const int &d = c; // 可有可无const
c = 3;
cout << c << " " << d << endl; // 输出 a = 3 b =3

 

问题:1.为什么第一段代码必须有const?第二段中不用有const?

   2.为什么第一段代码中a,b输出的值不同?而第二段中c,d的值相同?

 

 

 

原因:

1.在第一段中,a的值为double类型,而b是整形类型的对a的引用,所以,这个过程必定会发生隐式类型转换。

      对于这段 const int & b = a; 代码,编译器会把这段代码变成如下形式

          const int temp = a;   // 隐式转换,生成中间temp,而这个temp是常量

          const int &b = temp; 

所以b必须为常量引用(因为中间生成的temp就是常量);而第二段代码中没有发生过隐式转换。

 

2.第一段中因为常量引用b引用的是中间生成的temp。改变a值,对b毫无影响。

第二段中常量引用d引用的是c,没有生成中间值,所以c改变,d也就改变了。

 

posted on 2020-07-20 15:37  黑色spider  阅读(4053)  评论(0编辑  收藏  举报