use*_*956 3 c++ ostream operator-keyword
对此有很多问题和答案,但我无法真正找到为什么我们需要通过引用返回.
如果我们有(假设运算符已经为对象MyObject正确重载):
MyObject obj1;
MyObject obj2;
cout << obj1 << obj2;
Run Code Online (Sandbox Code Playgroud)
现在,会有像((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;
}
Run Code Online (Sandbox Code Playgroud)
其结果是:8,9 7,5 4,1 2,3
但是,如果我通过引用返回重载并将参数设置为引用,并在重载时修改并返回*this,我得到:2,3 2,3 2,3 2,3
在第一个例子中没有对象被改变的原因是什么?是因为左值与右值?比较速记运营商怎么样?
好的,另一个更新.如上所述,正确的结果应该是2,3.但是,如果我将重载运算符写为:
Blah Blah::operator =(Blah rhs){
x = rhs.x;
y = rhs.y;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
然后,我会得到正确的结果.(2,3 2,3 2,3 2,3).*这会怎么样?重载的运算符在重载函数中用rhs更新lhs,但返回*这似乎没有意义.*最终在哪里:b3 = b4 = b2 = b1?它是否会尝试返回左侧,以便当链达到b3时它实际上不会返回任何内容(这将尝试返回到左侧)?
主要原因是因为按值返回会生成副本,而iostream对象不可复制.它们具有状态和标识,并且不清楚复制它们应该意味着什么:对象包含(逻辑上,至少)它在流中的位置,所以如果我创建一个副本,我有两个对象将写在同一位置流.