详解c++引用

参考自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)具体事例:

  const doublet = 9.3;
  constint& k = t;
  cout<<&k<<endl;
  cout<<&t<<endl;

输出是

0012FF6C

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

 

  int t = 9;
  int& k = t;
  cout<<&k<<endl;
  cout<<&t<<endl;

输出是

0012FF74

0012FF74





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值