对此有很多问题和答案,但我真的找不到为什么我们需要通过引用返回。
如果我们有(假设运算符已经为对象 MyObject 正确重载):
MyObject obj1;
MyObject obj2;
cout << obj1 << obj2;
现在,会有像 ((cout << obj1) << obj2)); 这样的子表达式。问题是为什么我们不能按值返回?(好吧,假设它允许将 ostream 作为值返回)如果 cout << obj1 返回一个流对象而不是引用,有什么区别?那么为什么链接是不可能的呢?就像重载 '=' 运算符一样,如果我们按值返回,我们不能像 A=B=C=D 那样链接。为什么 ?
谢谢你的回答。我意识到我可以在不通过引用返回的情况下进行链接,但是重载'='时我的输出完全不同。如果我写:
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){
Blah ret;
ret.x = rhs.x;
ret.y = rhs.y;
return ret;
}
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;
}
输出为:8,9 7,5 4,1 2,3
但是,如果我通过引用返回重载并将参数设置为引用,并在重载时修改并返回 *this,我得到:2,3 2,3 2,3 2,3
第一个示例中没有更改对象的原因是什么?是因为 lvalues vs rvalues 吗?相比之下,速记运算符怎么样?
好的,另一个更新。如前所述,正确的结果应该是所有人的 2,3。但是,如果我将重载运算符编写为:
Blah Blah::operator =(Blah rhs){
x = rhs.x;
y = rhs.y;
return *this;
}
然后,我会得到正确的结果。(2,3 2,3 2,3 2,3)。*this 会发生什么?重载运算符在重载函数中用 rhs 更新 lhs,但返回 *this 似乎毫无意义。*this 在哪里结束: b3 = b4 = b2 = b1 ?它会尝试返回左侧,因此当链到达 b3 时它实际上什么也不返回(这将尝试返回左侧)?