18

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

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つの異なるサンプルオブジェクトを追加したい場合、どのように操作者にオーバーロードするかです。例:s = s1 + s2;

s = s + s1 + s2既存の実装でやりたいと思います。

4

1 に答える 1

29

フレンド演算子のオーバーロードを使用すると、うまくいくはずであり、二項演算子を定義する一般的な方法です。次を追加するだけです。

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が返されるためです。次に、そのサンプルに追加しようとします。ただし、一時的なものは参照[1]のみであるため、メンバー関数のみを使用できます。メンバー関数は関数ではないため、一時的にその関数を使用することはできません。あなたのバージョンはの左側のオブジェクトを変更するので、それを作るために、私はそれを書き直さなければならなかったことに注意してください。 samples2constconstoperator+constconstconst+

[1]例外はここでは特に関係ありません。つまり、右辺値です。

于 2012-06-22T17:56:26.470 に答える