これには多くの質問と回答がありますが、参照によって戻る必要がある理由が本当にわかりません。
ある場合 (オブジェクト 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
最初の例でオブジェクトが変更されない理由は何ですか? 左辺値と右辺値が原因ですか? 比較すると、省略形の演算子はどうですか?
わかりました、別の更新。前述のとおり、正しい結果はすべて 2,3 である必要があります。ただし、オーバーロードされた演算子を次のように書くと:
Blah Blah::operator =(Blah rhs){
x = rhs.x;
y = rhs.y;
return *this;
}
その後、正しい結果が得られます。(2,3 2,3 2,3 2,3)。*this はどうなりますか? オーバーロードされた演算子は、オーバーロード関数で lhs を rhs で更新しますが、*this を返すことは無意味に思えます。*これはどこで終わるのですか : b3 = b4 = b2 = b1 ? チェーンが b3 に達したときに実際には何も返さないように、左に戻ろうとしますか (それは左に戻ろうとします)?