您的位置:首页 > 其它

引用 && const 要注意的一些地方

2014-05-01 22:22 183 查看




参考自http://my.oschina.net/sasa/blog/7921,此外加上我自己的解释

(1)const和non-const引用

const引用可读不可改,与绑定对象是否为const无关

非const引用可读可改,只可与非const对象绑定

(2)引用可以绑定到哪些对象

非const引用只能绑定到与该引用同类型的对象。

double t = 9.3;

int& k = t; //error

const引用则可以绑定到不同但相关的类型的对象或绑定到左值。

(3)引用的初始化

1.定义引用时必须进行初始化。初始化是指明引用指向哪个对象的唯一方法。

2.当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。并且不可能将引用绑定到另一个对象。

 

 关于引用的初始化有两点值得注意:

(1)当初始化值是一个左值(可以取得地址)时,没有任何问题;

(2)当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:

首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量。

 

double dval = 3.14;

const int &ri = dval;

编译器会把这些代码转换成如以下形式的编码:

int temp =dval;                 // create
temporary int from the double

const int &ri = temp;       // bind ri to
that temporary
这样做的原因:如果 ri 不是 const,那么可以给 ri赋一新值。这样做不会修改 dval,而是修改了
temp。期望对 ri 的赋值会修改 dval 的程序员会发现 dval 并没有被修改。仅允许 const引用绑定到需要临时使用的值完全避免了这个问题,因为 const 引用是只读的

 (4)具体事例:

源码打印

<span style="font-size: 18px; ">  const doublet = 9.3;  

  constint& k = t;  

  cout<<&k<<endl;  

  cout<<&t<<endl;</span>  

输出是

0012FF6C

0012FF74//使用了临时变量,所以地址不同

 

源码打印

<span style="font-size: 18px; ">  int t = 9;  

  int& k = t;  

  cout<<&k<<endl;  

  cout<<&t<<endl;</span>  

输出是

0012FF74

0012FF74
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: