我到处都读过必须初始化引用然后再进行初始化.
为了测试我的理解,我写了以下小程序.似乎我已经成功地重新分配了一个引用.有人可以向我解释我的程序中实际发生了什么吗?
#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;它,它将不允许你分配给它.
iam*_*ind 10
似乎我已经成功地重新分配了一个引用.真的吗?
不,你没有.您实际上正在重新分配值,并且您没有重新绑定引用.
在你的例子中,当你这样做时int &ri = i;,它的生命ri是必然的i.当你这样做时ri = j;,你只需要赋值jto ri.ri仍然是一个参考i!并且它会产生与您编写的相同的结果i = j;
如果您理解指针,那么请始终将该引用视为对任何类型的T* const位置的类比解释T.
当您将某些内容分配给引用时,您实际上将值分配给了引用绑定到的对象。所以这:
ri=j;
Run Code Online (Sandbox Code Playgroud)
具有相同的效果
i = j;
Run Code Online (Sandbox Code Playgroud)
会有因为ri是必然的i。所以任何 on 的动作ri都是在上执行的i。
您不能“重新安置”参考(https://isocpp.org/wiki/faq/references#reseating-refs)。
C++ 中引用的一个有用的口头禅是引用就是它们引用的对象。您对其所做的任何更改都会更改它们所指的内容。使用咒语,你可能会看到当你这样做时发生了什么ri = j,我现在是j。
| 归档时间: |
|
| 查看次数: |
25233 次 |
| 最近记录: |