C++ class 引用 return 类型的成员函数

C++ class member function with reference return type

我是编程和 C++ 的新手。 我对引用在这里的工作方式有何不同感到困惑。

下面的代码输出 0 5 但从 A &GotObj() 中删除 & 将输出 0 0。为什么第二种情况没有输出0 5

提前致谢。

#include <iostream>
using namespace std;

class A {
public:
    int val;
    A(int n=0) {
        val = n;

    }
    A &GetObj() {
        return *this;
    }
};

int main() {
    A a;
    cout << a.val << endl;
    a.GetObj() = 5;
    cout << a.val << endl;
    return 0;
}

当您 return 按值表达时 a.GetObj() 只是创建一个临时的。然后分配只会更改该临时值。

这只是一个指针的引用,语法略有不同。 当GetObj定义为

A& GetObj() { return *this: }

它 returns 对 a 的引用(即指针)。 然后,赋值

a.GetObj() = 5

使用参数 5 有效地调用 a 的赋值运算符,这会将 a 的值更改为 5。

但是如果你定义GetObj()

A GetObj { return *this; }

它 returns 一个全新的临时对象,与 a 具有相同的值。 因此,当您稍后为其分配 5 时,它不会更改 a.

的值

Case 1: A GetObj()

  • 让我们创建 Class A 的对象:

A a;

  • 假设这个对象的内存位置是0x87965432。现在,当你调用对象 a 的函数时 a.GetObj() 然后它 return 是一个临时对象,其内存位置将与 Class A 的对象 a 完全不同,假设 0x98672345。现在,如果您通过
  • 分配值 5

a.GetObj() = 5

  • 然后您将值 5 分配给位于内存位置 0x98672345 的对象。现在,您将打印位于内存位置 0x87965432 的对象的 val 变量。这就是为什么它会打印 0.

Case 2: A &GetObj()

  • 如案例 1 中所述,如果您通过
  • 创建对象

A a;

  • 让我们考虑它的内存位置 0x87965432。现在,当您通过 a.GetObj() 调用函数 GetObj 时,return 对象将位于与 return 概念相同的内存位置 0x87965432通过参考。现在给这个对象赋值 5,

a.GetObj() = 5

会在对象a中体现效果。现在变量 val 的打印值将如预期的那样 5.