我们可以在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;rii一生的保证。 当你做ri = j; ,你只是简单地将j的值riri仍然是i的参考! 而且它的结果与你写成i = j;结果相同i = j;

如果你很好地理解了指针,那么总是把引用看作T* const的类比解释,其中T是任何types。

当你给一个引用分配一些东西时,你实际上把这个值赋给了这个引用绑定的对象。 所以这:

 ri=j; 

有同样的效果

 i = j; 

会有,因为ri是必然的。 所以ri上的任何操作都会在i上执行。

执行ri = j;时,您不会重新分配参考ri = j; 。 你实际上把j分配给i 。 尝试打印后,你会看到i改变了价值。