c++ - C++ 中 lhs 和 rhs 区别的引用

标签 c++ reference

我正在学习C++,我发现当引用在右手边时,可以有两种情况。假设我有一个方法:

int& GetMe(int& i) { return i; }

我有:

(1) int j; GetMe(j) = GetMe(i);

(2) int& k = GetMe(i);

(1)和(2)的结果是不同的。在(1)中,语义是将i的值复制到j中。 ij 的地址保持不变。更改 i 根本不会影响 j。实际上,当您重载索引运算符 [] 并使用索引运算符进行赋值时就是这种情况。在 (2) 中,语义是将 i 的指代创建为 kki 具有相同的地址,更改 i 会影响 k

那么为什么我们会有差异呢?我认为,在 C++ 中,引用的地址只确定一次。一旦确定了引用的地址,以后就永远无法更改。在(1)中,j的引用是之前确定的,所以 Action 是将值从i复制到j。在 (2) 中,k 的引用被声明和初始化,因此它是使用 i 的引用完成的。所以 Action 是引用初始化。

我没有找到明确说明以上内容的 Material ,所以我想确认一下。任何人都知道 C++ 中的引用必须可以帮助我或指出我清晰的 Material 。非常感谢您。

最佳答案

您在这里缺少的是变量类型不同,这才是最重要的。在第一个示例中,您有 int j,在第二个示例中 - int &k

函数原型(prototype)中的引用存在于不同的基础上,它们看起来相同,在底层它们几乎相同但它们的使用方式不同,因为它们仅在方法执行时存在。

实际上,您的代码完全遵循

int j;
int & j1 = j;
int & i1 = i;
j1 = i1;

对比

int & i1 = i;
int & k = i1;

很容易看出,在第一种情况下,两个引用实际上引用了不同的变量,即内存中的不同部分,但在第二种情况下,它们都引用了完全相同的变量。因此存在差异。

关于c++ - C++ 中 lhs 和 rhs 区别的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1522912/

相关文章:

c++ - Visual Studio C++ 调试器 : No hex dump?

c++ - 如果文件未正确完成,如何使用 libav 编写可播放的 .mov 文件

c++ - 具有许可许可的稳健、快速的复杂多边形(带孔)三角剖分 c/c++ 库

ASP.NET和Visual Studio-添加项目引用与Bin文件夹DLL

javascript - React - 更新状态数组时对象中的唯一键被覆盖

c++ - 标准布局和不可复制的属性

c++如何在不丢失值(value)的情况下重铸

c# - using 语句是否保留对其接收的对象的引用?

c++ - 提示编译器在使用 auto 时按引用返回,而不是使用 ->

c++ - 无法重载对 *this 的引用