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