百度面试题 c++ 实现引用类型与被引用的对象分离的一种方法

  这个问题想了很久,一般情况下,一个引用变量一旦指定被引用变量后,是不能作为另一个变量的引用的,这也是为什么人家喜欢将引用与int * const p 等价的原因,即引用和指针常量有相同的性质,所以p不能指向其他对象,而且p必须在定义的时候初始化,这和引用性质一样。

  其实通过上篇关于引用底层实现机制文章的分析,要使已经绑定的引用与被引用对象之间实现分离,必须修改b的值,b的值实际上是x的地址,但是在语言级别上,对b的任何操作都等价于对(*b)即x的操作,我们没法得到b的实际值。怎么办,没办法操作b,我们就只能采用间接的方法,通过b的邻居(如程序中的y)来获得b的信息。这有个简单的生活例子,要了解某个人,我们如果不想亲自和这个人交往的话,可以通过他的朋友去理解。好了,废话少说,先把程序写出:

#include <stdio.h>
#include <iostream>

using namespace std;


void main()
{
   int x = 1;
   int y = 2;
   int &b = x;


   printf("x=%d,y=%d,b=%d\n",x,y,b);
   b++;
   printf("x=%d,y=%d,b=%d\n",x,y,b);

   *(&y-1) =(int)(&y);//&y要用int强制类型转换,否则出现 int * 转换到 int的错误

   b++;
   printf("x=%d,y=%d,b=%d\n",x,y,b);
} 
输出如下:x=1,y=2,b=1
x=2,y=2,b=2
x=2,y=3,b=3
Press any key to continue

 我们知道y和b在地址上应该是相邻的(特殊情况除外),&y-1 就是b 的地址(很可惜,我们不能直接通过&b获得b的地址,因为&b即&x,得到的是x的地址),因为栈中的地址是按从高到低分配的。

  *(&y-1) =(int)(&y);  这句就是将y的地址赋给b,这样不就实现了b与x的分离,以及b与y的绑定,b成为了y的引用了吗?有什么不理解的可以参考我的上篇关于引用的文章。

  看来,理解引用的底层实现机制,才是解决问题的关键。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值