2016-03-26 6 views
2

戻り値のタイプがoperator+=のオペレータオーバーロードについては、インターネットでいくつか例を見てきましたが、T&です。 +=T a = b = c;のようにチェーン化できないので、戻り値の型をvoidとして宣言しても問題ありません。 voidを使用すると、すべて正常に動作するようです。私たちはそれを避けなければならない状況はありますか? EXのためにreturn type of operator + =オーバーロード中

class MyInteger{ 
    private: 
     int x; 
    public: 
     MyInteger(const int& a):x(a){} 
     void operator+=(const MyInteger& rhs){ 
      x += rhs.x; 
     } 
}; 

MyInteger a(10); 
a += a; //No need to return anything because we can't chain 
a = a + (a += a); 
+5

"+ =' "をチェーンできないため?何故なの? '(((a + = b)+ = c)+ = d)'または 'a + =(b + =(c + = d)))'である。今までと同じように連鎖可能です。 – AnT

+0

@AnTええ、でも、何も返す必要はありません。変更はLHSで行われ、次の操作に変更が適用されるためです。したがって、返品として 'T&'は必要ありません。 –

+1

しかし、チェーン化したい場合は、何かを返す必要があります。 – AnT

答えて

3

operator +=が現在のオブジェクトへの参照を返すようにするもう1つの理由は、オーバーロードするときです。operator +。整数クラスを書いているので、+=が利用可能であったとしても意味がありませんが、+は利用できませんでした。 operator +=参照を返さなかった場合は機能(あるいはコンパイル)ができませんでした上記

MyInteger MyInteger::operator+(const MyInteger& rhs) 
{ 
    MyInteger temp(*this); 
    return temp += rhs; // <-- Uses operator += 
} 

:ここ

operator +がどのように見えるかです。

+0

私はこの正当な点に同意します。これは頻繁に見ていますが、疑念が生じたときに私の脳を攻撃しなかったからです。 –

3

@Antがすでに指摘したように、それ連鎖させることができ、それが唯一の考慮事項ではありません。例:

cout << (a += b); 

たとえば、返品がない場合、これは動作しません。

算術演算子そのものは人間の習慣ではありません。技術的には、+= do -=もできます。新しいプライベートコンベンションに従う限り、あなたのために構築され、実行されます。 C++内では、言語の規則に従う必要があります:あなたのコードのクライアントはその+=自己増分を期待し、

cout << (a += b); 

が結果をプリントアウトすることでしょう。

関連する問題