我知道对此已经有很多问题,所以请耐心等待我回答这个问题。
所以我找到了this问题,我对修改这个有疑问。
class Blah {
public:
Blah();
Blah(int x, int y);
int x;
int y;
Blah operator =(Blah rhs);
};
Blah::Blah() {}
Blah::Blah(int xp, int yp) {
x = xp;
y = yp;
}
Blah Blah::operator =(Blah rhs) {
x = rhs.x;
y = rhs.y;
return *this;
}
int main() {
Blah b1(2, 3);
Blah b2(4, 1);
Blah b3(8, 9);
Blah b4(7, 5);
b3 = b4 = b2 = b1;
cout << b3.x << ", " << b3.y << endl;
cout << b4.x << ", " << b4.y << endl;
cout << b2.x << ", " << b2.y << endl;
cout << b1.x << ", " << b1.y << endl;
return 0;
}
所以我在这里没有使用 return by reference,同时重载了 = 运算符,我仍然得到了预期的输出。
为什么我应该通过引用返回?我看到的唯一区别是在按值返回时调用复制构造函数,但在按引用返回时不调用复制构造函数。
有人可以为我简化一下并解释通过引用返回背后的概念/想法吗?大约一年前在我的类里面讲过,但我仍然不明白。
最佳答案
这里没有严格的对错之分。你可以用运算符重载做一些奇怪的事情,有时这是合适的。但是,很少有充分的理由从 operator=
返回一个新实例。
返回值是启用链接。您的链接测试不完整。你的线路:
b3 = b4 = b2 = b1;
与
相同b3 = (b4 = (b2 = b1));
您会看到这种情况下的预期输出。但是,像这样链接
(b3 = b4) = b1;
应该首先将b4
分配给b3
,然后将b1
分配给b3
。或者您可能想在返回的引用上调用一个方法:
(b3 = b4).foo();
当您返回一个拷贝时,第二个赋值将是一个临时对象,成员函数 foo
将在一个临时对象上调用,而不是像预期的那样在 b3
上调用。要查看此操作,请考虑此输出
int main() {
Blah b1(2, 3);
Blah b2(4, 1);
Blah b3(8, 9);
Blah b4(7, 5);
(b3 = b4) = b1;
cout << b3.x << ", " << b3.y << endl;
cout << b1.x << ", " << b1.y << endl;
return 0;
}
退回拷贝时:
7, 5
2, 3
返回引用时:
2, 3
2, 3
更简单的原因是您不想在不需要制作拷贝时返回拷贝。
关于c++ - 为什么在重载 = 运算符时通过引用返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63041350/