3

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;
};
4

2 に答える 2

4

それを除いて、それは大きな違いはありません

  • Xメンバ バージョンが機能するには、等値演算子の左側にのインスタンスが必要です。いつか書きたいと思ったら

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

    非会員が必要です。

  • すべての二項関係演算子を実装すると、クラスの表面積が大幅に増加する可能性があります。

    私は通常、この種の補助インターフェイスを、可能な場合はメイン クラスのロジックから離しておくことを好みます (もちろん、クラスの主要な関心事が比較である場合を除きます)。

    フレンドフリーではないオペレーターと最小限の公開インターフェースを使用することは、おそらくさらに優れています。

于 2016-11-10T18:15:18.943 に答える
3

注意すべきことの 1 つは、暗黙的な変換です。

クラスが他の型からの暗黙的な変換をサポートしている場合、operator==をフレンドにして、最初の引数で暗黙的な変換をサポートすると便利な場合があります。

それ以外の場合は、スタイルの問題だと思います。

于 2016-11-10T18:08:04.793 に答える