2

C++でバイナリ・リレーショナル演算子をオーバーロードするための正しい/標準的な方法は何ですか?C++でバイナリ・リレーショナル演算子をオーバーロードする適切な方法

はそれがより良いメンバ関数、またはfriend無料の機能を使用することですか?

例えば:

class X { 
public: 
    ... 

    // Use member function overloads 
    bool operator==(const X& rhs) const { 
    return m_text == rhs.m_text; 
    } 

private: 
    std::string m_text; 
}; 

か:

class X { 
public: 
    ... 

    // Use friend free function overloads 
    friend bool operator==(const X& lhs, const X& rhs) { 
    return lhs.m_text == rhs.m_text; 
    } 

private: 
    std::string m_text; 
}; 
+0

[この質問](http://stackoverflow.com/questions/1691007/whats-the-right-way-to-overload-operator-for-a-class-hierarchy?rq=1)mayおそらく助けてください。 – Rakete1111

答えて

3

あなたが知っておくべき一つのことは、暗黙的な変換です。

クラスが他の型からの暗黙的な変換をサポートしている場合、演算子==を最初の引数で暗黙の変換をサポートするように友人にすると便利です。

他のケースでは、それはもっとスタイルの問題だと思います。

+0

私が間違っている場合は私を修正しますが、暗黙の変換はメンバーオペレーターであっても行われます。 –

+1

@BrunoFerreira基本的に、パラメーターは暗黙的な変換の対象となるのは、パラメーターリストにリストされている場合のみですが、* operator == *がメンバー関数の場合、最初のパラメーターは* this *であり、暗黙的変換には適格ではありません。 –

+0

[私は小さなテストケースを作った](http://coliru.stacked-crooked.com/a/5eefd0778684b48e)とはい、intへの暗黙の変換を取り除くと失敗します。 –

3

それはXのインスタンスが動作するようにメンバーのバージョンのための等価演算子の左辺にする必要があります除く

  • ことを、あまり違いはありません。あなたが書き込みたい場合は

    X x("hello"); 
    string s("hello"); 
    assert(s == x); 
    

    が必要です。

  • すべてのバイナリ・リレーショナル演算子を実装している場合、クラスの表面積が大幅に増加する可能性があります。

    私は、この種の補助インターフェイスを、可能であればメインクラスのロジックから隔離しておくことをお勧めします(もちろん、クラスの主な関心事項が比較でない限り)。

    フレンドリーでない無料の演算子と最小のパブリックインターフェイスを使用するほうがおそらくさらに優れています。

関連する問題