web-dev-qa-db-ja.com

クラス外の演算子オーバーロード

C++クラスの演算子をオーバーロードするには、2つの方法があります。

内部クラス

class Vector2
{
public:
    float x, y ;

    Vector2 operator+( const Vector2 & other )
    {
        Vector2 ans ;
        ans.x = x + other.x ;
        ans.y = y + other.y ;
        return ans ;
    }
} ;

授業外

class Vector2
{
public:
    float x, y ;
} ;

Vector2 operator+( const Vector2& v1, const Vector2& v2 )
{
    Vector2 ans ;
    ans.x = v1.x + v2.x ;
    ans.y = v1.y + v2.y ;
    return ans ;
}

(どうやらC#では、「外部クラス」メソッドしか使用できないようです。)

C++では、どちらの方法がより正しいですか?どちらが好ましいですか?

43
bobobobo

MeyerのEffective C++でこの問題について優れた議論があります:項目24は「型変換をすべてのパラメーターに適用する必要がある場合に非メンバー関数を宣言する」、項目46は「型変換が必要な場合にテンプレート内の非メンバー関数を定義する」です。

4
Francesco