0

我是编程和 C++ 的新手。我很困惑参考在这里的不同之处。

下面的代码输出0 5但删除&fromA &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;
}
4

3 回答 3

1

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

于 2016-01-07T05:51:22.077 回答
1

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

A& GetObj() { return *this: }

它返回对 a 的引用(即指针)。然后,任务

a.GetObj() = 5

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

但是如果你定义GetObj()

A GetObj { return *this; }

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

于 2016-01-07T05:54:05.063 回答
-1

案例 1:一个 GetObj()

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

一个;

  • 假设这个对象的内存位置是0x87965432。现在,当您通过 a.GetObj()调用对象 a 的函数时,它会返回一个临时对象,其内存位置将与 A 类的对象 a 完全不同,比如说0x98672345。现在,如果您通过以下方式分配值 5

a.GetObj() = 5

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

案例 2:一个 &GetObj()

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

一个;

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

a.GetObj() = 5

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

于 2016-01-07T06:30:31.893 回答