私が本やWebで読んでいるように、C++では、「プラス」または「マイナス」演算子をこれらのプロトタイプでオーバーロードできます(_class Money
_のメンバー関数として)。
const Money operator +(const Money& m2) const;
const Money operator -(const Money& m2) const;
代入演算子の場合:
const Money& operator =(const Money& m2);
プラス演算子とマイナス演算子ではなく、代入演算子のオーバーロードの戻り値としてMoneyオブジェクトへの参照を使用するのはなぜですか?
割り当てから参照を返すと、連鎖が可能になります。
a = b = c; // shorter than the equivalent "b = c; a = b;"
(これは(ほとんどの場合)オペレーターが新しい値のコピーを返した場合にも機能しますが、一般的には効率が低下します。)
算術演算は新しい値を生成するため、算術演算から参照を返すことはできません。新しい値を返す唯一の(賢明な)方法は、値で返すことです。
例のように定数値を返すと、移動セマンティクスが妨げられるため、そうしないでください。
operator+
とoperator-
はthisオブジェクトには作用しませんが、このオブジェクトを別のオブジェクトから合計(または減算)した新しいオブジェクトを返します。
operator=
は、実際には割り当てこのオブジェクトに何かがあるため異なります。
operator+=
およびoperator-=
はこのオブジェクトに作用し、operator=
に類似しています。
あなたが求めていることを考えてください。式a + b
で、式の結果を持つaまたはbのいずれかへの参照を返す必要があります。したがって、aまたはbのいずれかを変更してaとbの合計にします。したがって、演算子(+)のセマンティクスを演算子(+ =)と同じになるように再定義する必要があります。そして、@ manuellが言ったように、あなたは(a + b) = c
を許可するでしょう。あなたが提案しているセマンティクスは、すでに+ =と-=によって提供されています。
オーバーロードされた代入演算子で値で返す場合は問題ないと思います。これは、代入演算子の結合性のためです。このことを考慮:
int a = b = c = 3;
ここでの結合性は次のとおりです:(a =(b =(c = 3)))
ただし、iostream操作cout << x << y << z;を検討してください。
ここでの結合性は次のとおりです:(((cout << x)<< y)<< z);
xが最初に出力されることがわかります。したがって、<<演算子のオーバーロードで値で返す場合、戻り値は「左辺値」ではありませんが、参照による戻り値は左辺値であるため、<<演算子のカスケードを実現できます。
もう1つ、値で返すとコピーコンストラクターが呼び出されます。 (参照による返品の場合はそうではありません)
以下に示すリンクには、私が推測するより良い説明があります C++での演算子オーバーロードの戻り値