web-dev-qa-db-ja.com

2つ以上のオブジェクトに対するC ++のオーバーロードされた加算代入演算子?

このように+演算子をオーバーロードしました

class sample
{
private : 
  int x;
public :
  sample(int x1 =0)
  {
    x = x1;
  }

  sample operator+(sample s);
};

sample sample::operator+(sample s)
{
  x = x + s.x;
  return *this;
}

int  main()
{
  sample s1(10);
  sample s2;
  s2 = s2 + s1;
  return 0;    
}

これは正しいです?私の質問は、2つの異なるサンプルオブジェクトを追加したい場合、opeartorをどのようにオーバーロードするかです。例:s = s1 + s2;

s = s + s1 + s2既存の実装。

15
Raulp

フレンドオペレーターのオーバーロードを使用することでうまくいくはずであり、バイナリオペレーターを定義する一般的な方法です。

friend sample operator+(const sample& a, const sample& b); //in class

sample operator+(const sample& a, const sample& b) { //outside the class
    return sample(a.x + b.x);
}

メンバーのままにしたい場合(まれなシナリオではマイナス面があり、プラス面がない)場合は、演算子をconst関数にする必要があります。

sample operator+(sample s) const; //in class

sample sample::operator+(const sample& b) const { //outside the class
    return sample(this->x + b.x);
}

これらのどちらでも、演算子の連鎖が可能になります。以前のs = s + s1 + s2が失敗した理由は、s + s1が実行されてtemporarysampleオブジェクトが返されるためです。次に、そのサンプルにs2を追加しようとします。ただし、一時変数はconst参照のみにすることができます[1]など、constメンバー関数のみを使用できます。 operator+メンバー関数はconst関数ではないため、const一時関数でその関数を使用することはできません。これをconstにするには、書き直さなければならなかったことに注意してください。バージョンによって+の左側のオブジェクトが変更されるためです。

[1]例外を除いて、ここでは特に関連性はありません。つまり、右辺値

22
higuaro