运算符重载返回引用
Operator overloading returning a reference
我在研究运算符重载时试图了解返回引用的真正意义。我创建了这个非常简单的问题:
#include <iostream>
using namespace std;
class mydoub {
public:
double pub;
mydoub(double i = 0) : pub(i) {}
};
mydoub &operator += (mydoub &a, double b) {
a.pub = a.pub+b;
return a;
}
int main() {
mydoub a(5), b(6);
cout << "1: " << a.pub << " " << b.pub << endl; // expected output 1: 5 6
b = a+= 7;
cout << "2: " << a.pub << " " << b.pub << endl; // expected output 2: 12 12
b.pub = 8;
cout << "3: " << a.pub << " " << b.pub << endl; // unexpected output: 3: 12 8
}
输出为:
1: 5 6
2: 12 12
3: 12 8
这让我很意外。事实上,b
已经被分配了对 a
的引用,就在 a
被修改之后,所以我希望 b.pub=8
也对 a
起作用,因此通过运算符 +=
的引用。为什么不是这样?那么与非引用重载有什么区别,比如 mydoub operator += ( ..
?
你搞乱了对引用的理解。实际上,引用只是取消引用的指针,当您执行 b = a
时,它实际上是将 a 值复制到 b,它们并不指向同一个对象。要指向同一对象,您需要使用指针或使 b 不是 mydoub 类型,而是 mydoub& 类型(在这种情况下,在初始化时您可以指向同一对象)。
mydoub&运算符+=用于修改+=运算符的结果。例如,
mydoub a = 1;
++(a += 3)
之后 a 将是 5,但如果您使用 mydoub 运算符 += 它将是 4。
我在研究运算符重载时试图了解返回引用的真正意义。我创建了这个非常简单的问题:
#include <iostream>
using namespace std;
class mydoub {
public:
double pub;
mydoub(double i = 0) : pub(i) {}
};
mydoub &operator += (mydoub &a, double b) {
a.pub = a.pub+b;
return a;
}
int main() {
mydoub a(5), b(6);
cout << "1: " << a.pub << " " << b.pub << endl; // expected output 1: 5 6
b = a+= 7;
cout << "2: " << a.pub << " " << b.pub << endl; // expected output 2: 12 12
b.pub = 8;
cout << "3: " << a.pub << " " << b.pub << endl; // unexpected output: 3: 12 8
}
输出为:
1: 5 6
2: 12 12
3: 12 8
这让我很意外。事实上,b
已经被分配了对 a
的引用,就在 a
被修改之后,所以我希望 b.pub=8
也对 a
起作用,因此通过运算符 +=
的引用。为什么不是这样?那么与非引用重载有什么区别,比如 mydoub operator += ( ..
?
你搞乱了对引用的理解。实际上,引用只是取消引用的指针,当您执行 b = a
时,它实际上是将 a 值复制到 b,它们并不指向同一个对象。要指向同一对象,您需要使用指针或使 b 不是 mydoub 类型,而是 mydoub& 类型(在这种情况下,在初始化时您可以指向同一对象)。
mydoub&运算符+=用于修改+=运算符的结果。例如,
mydoub a = 1;
++(a += 3)
之后 a 将是 5,但如果您使用 mydoub 运算符 += 它将是 4。