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

您应该注意的一件事是隐式转换。

如果您的类支持来自其他类型的隐式转换,则让operator==成为朋友以支持其第一个参数的隐式转换可能会很有用。

在其他情况下,我认为更多的是风格问题。

于 2016-11-10T18:08:04.793 回答