このように+演算子をオーバーロードしました
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
既存の実装。
フレンドオペレーターのオーバーロードを使用することでうまくいくはずであり、バイナリオペレーターを定義する一般的な方法です。
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]例外を除いて、ここでは特に関連性はありません。つまり、右辺値