这个问题想了很久,一般情况下,一个引用变量一旦指定被引用变量后,是不能作为另一个变量的引用的,这也是为什么人家喜欢将引用与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的引用了吗?有什么不理解的可以参考我的上篇关于引用的文章。
看来,理解引用的底层实现机制,才是解决问题的关键。