web-dev-qa-db-ja.com

プラスマイナス演算ではなく、代入演算子のオーバーロードで参照リターンを使用するのはなぜですか?

私が本や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オブジェクトへの参照を使用するのはなぜですか?

15
MinimalTech

割り当てから参照を返すと、連鎖が可能になります。

a = b = c;  // shorter than the equivalent "b = c; a = b;"

(これは(ほとんどの場合)オペレーターが新しい値のコピーを返した場合にも機能しますが、一般的には効率が低下します。)

算術演算は新しい値を生成するため、算術演算から参照を返すことはできません。新しい値を返す唯一の(賢明な)方法は、値で返すことです。

例のように定数値を返すと、移動セマンティクスが妨げられるため、そうしないでください。

16
Mike Seymour

operator+operator-thisオブジェクトには作用しませんが、このオブジェクトを別のオブジェクトから合計(または減算)した新しいオブジェクトを返します。

operator=は、実際には割り当てこのオブジェクトに何かがあるため異なります。

operator+=およびoperator-=はこのオブジェクトに作用し、operator=に類似しています。

8
John Dibling

あなたが求めていることを考えてください。式a + bで、式の結果を持つaまたはbのいずれかへの参照を返す必要があります。したがって、aまたはbのいずれかを変更してaとbの合計にします。したがって、演算子(+)のセマンティクスを演算子(+ =)と同じになるように再定義する必要があります。そして、@ manuellが言ったように、あなたは(a + b) = cを許可するでしょう。あなたが提案しているセマンティクスは、すでに+ =と-=によって提供されています。

2
ChuckCottrill

オーバーロードされた代入演算子で値で返す場合は問題ないと思います。これは、代入演算子の結合性のためです。このことを考慮:

int a = b = c = 3;

ここでの結合性は次のとおりです:(a =(b =(c = 3)))

ただし、iostream操作cout << x << y << z;を検討してください。

ここでの結合性は次のとおりです:(((cout << x)<< y)<< z);

xが最初に出力されることがわかります。したがって、<<演算子のオーバーロードで値で返す場合、戻り値は「左辺値」ではありませんが、参照による戻り値は左辺値であるため、<<演算子のカスケードを実現できます。

もう1つ、値で返すとコピーコンストラクターが呼び出されます。 (参照による返品の場合はそうではありません)

0
pankaj kushwaha

以下に示すリンクには、私が推測するより良い説明があります C++での演算子オーバーロードの戻り値

0
samprat