我们可以在C ++中重新分配参考吗?
我已经到处阅读,那么在那里和那里都必须初始化参考,不能再次重新初始化。
为了testing我的理解,我写了下面的小程序。 似乎我已经成功地重新分配了一个参考。 有人可以向我解释我的程序中究竟发生了什么?
#include <iostream> #include <stdio.h> #include <conio.h> using namespace std; int main() { int i = 5, j = 9; int &ri = i; cout << " ri is : " << ri <<"\n"; i = 10; cout << " ri is : " << ri << "\n"; ri = j; // >>> Is this not reassigning the reference? <<< cout << " ri is : " << ri <<"\n"; getch(); return 0; }
代码编译得很好,输出如我所料:
ri is : 5 ri is : 10 ri is : 9
ri = j; // >>> Is this not reassigning the reference? <<<
不, ri
仍然是i
的参考 – 你可以通过打印&ri
和&i
来certificate这一点,并且看到它们是相同的地址。
你所做的是通过参考ri
修改i
。 打印后,你会看到这个。
另外,为了比较,如果你创build一个const int &cri = i;
它不会让你分配。
似乎我已经成功地重新分配了一个参考。 真的吗?
不 ,你没有。 你实际上正在重新分配这个值,而你并没有重新引用这个参考。
在你的例子中,当你做int &ri = i;
, ri
是i
一生的保证。 当你做ri = j;
,你只是简单地将j
的值ri
。 ri
仍然是i
的参考! 而且它的结果与你写成i = j;
结果相同i = j;
如果你很好地理解了指针,那么总是把引用看作T* const
的类比解释,其中T
是任何types。
当你给一个引用分配一些东西时,你实际上把这个值赋给了这个引用绑定的对象。 所以这:
ri=j;
有同样的效果
i = j;
会有,因为ri
是必然的。 所以ri
上的任何操作都会在i
上执行。
执行ri = j;
时,您不会重新分配参考ri = j;
。 你实际上把j
分配给i
。 尝试打印后,你会看到i
改变了价值。