1

重複の可能性:
演算子をメンバー関数または非メンバー(フレンド)関数としてオーバーロードしますか?

C ++で演算子のオーバーロードを学習する過程で、2つの異なるタイプのオーバーロード演算子+を見てきました。

どの方法を使用するのが良いか教えてください:最初の方法:

Complex Complex::operator + (Complex &obj) {
   return Complex( re + obj.re, im + obj.im );
}

2番目の方法:

Complex operator + (const Complex &obj1, const Complex &obj2) { 
    // this function is friend of class complex
    return Complex(obj1.re + obj2.re, obj1.im + obj2.im);
}

ありがとうございました!!!

4

2 に答える 2

4

暗黙の変換がない限り、どちらも同じように優れています。それはもっと好みの問題です。Complex(この場合は可能性が高いと思われる)への暗黙の変換がある 場合、最初の形式では、暗黙の変換は2番目の引数でのみ機能します。例:

Complex c;
Complex d;

d = c + 1.0;    //  Works in both cases...
d = 1.0 + c;    //  Only works if operator+ is free function

このような場合、free関数が断然好ましい解決策です。多くの人々は、直交性の理由から、体系的にそれを好みます。

多くの場合、実際には、free関数は(メンバーになる)operator+という観点から実装されます。operator+=

Complex
operator+( Complex const& lhs, Complex const& rhs )
{
    Complex results( lhs );
    results += rhs;
    return results;
}

実際、これらすべての演算子を自動的に提供するテンプレート基本クラスを提供するのはかなり簡単です。(この場合、それらはfriendテンプレート基本クラスで一列に定義するために宣言されます。)

于 2012-04-16T10:30:53.803 に答える
1

Bjarne Stroustrupは、オブジェクト自体を変更しない場合、または提供された引数に基づいて新しい値/オブジェクトを生成する場合に、2番目の形式を使用することをお勧めします。

于 2012-04-16T10:20:34.573 に答える