C ++类成员函数,引用返回类型

时间:2016-01-07 05:48:00

标签: c++ reference this-pointer

我是编程和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;
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

A& GetObj() { return *this: }

它返回a的引用(即指针)。 然后,分配

a.GetObj() = 5

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

但是如果你将GetObj()定义为

A GetObj { return *this; }

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

答案 2 :(得分:-1)

  

案例1:GetObj()

  • 让我们创建A类对象:
  

A a;

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

a.GetObj()= 5

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

案例2:A&amp; GetObj()

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

A a;

  • 让我们考虑其内存位置 0x87965432 。现在当你通过a.GetObj()调用函数GetObj时,返回对象将具有相同的内存位置 0x87965432 ,作为其由Referance返回的概念。现在为此对象分配值5,
  

a.GetObj()= 5

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