6

私は C++ Primer を読んでいます。オーバーロードされた操作の章で、著者は例を挙げました:

// member binary operator: left-hand operand bound to implicit this pointer
Sales_item& Sales_item::operator+=(const Sales_item&);
// nonmember binary operator: must declare a parameter for each operand
Sales_item operator+(const Sales_item&, const Sales_item&);

次に、著者は次のように説明しました。

この違いは、算術型に適用された場合のこれらの演算子の戻り値の型と一致します。加算は右辺値を生成し、複合代入は左側のオペランドへの参照を返します。

「 」についてはよくわかりませんcompound assignment returns a reference to the left-hand operand。誰かがそれと関連することについて詳しく説明できますか?

4

2 に答える 2

5

これは、次のようなことができることを意味します

a = 1; 
(a += 1) += 1;

結果は == 3 になります。これは、一番左の += の呼び出しが変更aされ、それへの参照が返されるためです。次に、次の += が参照に作用し、a再び数値を追加します。

一方、通常の + 演算子は、引数の 1 つへの参照ではなく、結果のコピーを返します。したがって、これは、などの式a + a = 3;が不正であることを意味します。

于 2012-05-04T02:08:02.087 に答える
2
a = a + b;

また〜だ

a += b;

これはと同等です

a.operator+= (b)

演算子 += は、複合代入をサポートしています。

(a += b) += c;

と同等です

a.operator+= (b).operator+= (c);

右辺値の代わりに値が返された場合、最後の行は使用できません。

次の点を考慮してください。

c = a + b;

また〜だ

c = a.operator+ (b);

書き込み

a.operator+ (b) = c;

a の値は変更されないため、効果はありません。

于 2012-05-04T02:09:03.310 に答える