我们可以在C++中重新分配引用吗?

Inv*_*tus 63 c++ reference

我到处都读过必须初始化引用然后再进行初始化.

为了测试我的理解,我写了以下小程序.似乎我已经成功地重新分配了一个引用.有人可以向我解释我的程序中实际发生了什么吗?

#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;
}
Run Code Online (Sandbox Code Playgroud)

代码编译正常,输出正如我所期望的那样:

ri is : 5
ri is : 10
ri is : 9
Run Code Online (Sandbox Code Playgroud)

Use*_*ess 72

ri = j; // >>> Is this not reassigning the reference? <<<

不,ri仍然是一个参考i- 你可以通过打印证明这一点&ri,&i并看到它们是相同的地址.

你做的是i 通过引用修改ri.打印i之后,你会看到这个.

另外,为了进行比较,如果你创建const int &cri = i;它,它将不允许你分配给它.

  • 我每次都"犯" (3认同)

iam*_*ind 10

似乎我已经成功地重新分配了一个引用.真的吗?

,你没有.您实际上正在重新分配值,并且您没有重新绑定引用.

在你的例子中,当你这样做时int &ri = i;,它的生命ri是必然的i.当你这样做时ri = j;,你只需要赋值jto ri.ri仍然是一个参考i!并且它会产生与您编写的相同的结果i = j;

如果您理解指针,那么请始终将该引用视为对任何类型的T* const位置的类比解释T.


sha*_*oth 5

当您将某些内容分配给引用时,您实际上将值分配给了引用绑定到的对象。所以这:

ri=j;
Run Code Online (Sandbox Code Playgroud)

具有相同的效果

i = j;
Run Code Online (Sandbox Code Playgroud)

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


Sid*_*Sid 5

您不能“重新安置”参考(https://isocpp.org/wiki/faq/references#reseating-refs)。

C++ 中引用的一个有用的口头禅是引用就是它们引用的对象。您对其所做的任何更改都会更改它们所指的内容。使用咒语,你可能会看到当你这样做时发生了什么ri = j,我现在j。