为什么我可以在引用初始化后重新绑定它?

4
根据《C++ Primer》(Stanley B. Lippman, Josée Lajoie和Barbara E. Moo)的说法:
一旦初始化,引用将绑定到其初始对象。没有办法重新绑定引用以引用不同的对象。
那么,在下面的代码中,我如何似乎能够将初始化的引用重新绑定到另一个对象?
#include <iostream>

int main()
{
     int num1 = 10;
     int num2 = 20;

     int &rnum1 = num1;

     std::cout << rnum1 << std::endl;   // output: 10

     rnum1 = num2;

     std::cout << rnum1 << std::endl;   // output: 20

     return 0;
}

据我所知,num1和num2是两个不同的对象。虽然是相同类型的,但它们是完全不同的对象。

好问题;是的,这确实很令人困惑! - Bathsheba
4
如果你将引用视为隐藏的指针,那么就容易让人感到困惑。 - M.M
@M.M 这样做会让你成为一个非常淘气的男孩。 - Bathsheba
这就是我不喜欢C++中的引用,而更喜欢C语言中的普通指针的原因。它更加明确。 - Jonathon Reinhart
1
@JonathonReinhart:对我来说,它们最有用的形式是作为函数参数的“const”。 - Bathsheba
显示剩余2条评论
2个回答

7

rnum1 = num2;并不是重新绑定引用。

它将rnum1(因此也是num1)设置为num2的值。


4

rnum1num1的另一个名称。

当您编写rnum1 = ...时,就好像您编写了num1 = ...,因为rnum1num1的另一个名称。

因此,引用本身并没有重新绑定到另一个变量,这里只是对num1进行简单的赋值。

要真正证明它,您可以打印num1num2rnum1的内存地址:

#include <iostream>

int main()
{
     int num1 = 10;
     int num2 = 20;

     int &rnum1 = num1;

     std::cout << rnum1 << std::endl;   // output: 10

     rnum1 = num2;

     std::cout << rnum1 << std::endl;   // output: 20
     std::cout << &num1 << " " << &rnum1 <<" "<< &num2 << std::endl;
     return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接