c++中重载二元关系运算符的正确方法

Proper way of overloading binary relational operators in C++

本文关键字:方法 运算符 重载 二元关系 c++      更新时间:2023-10-16

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

没有太大区别,除了

  • X的实例必须位于相等操作符的左侧才能使成员版本生效。如果你想写

    X x("hello");
    string s("hello");
    assert(s == x);
    
  • 如果你实现了所有的二元关系运算符,那么你的类的表面积可能会有很大的增加。

    我通常希望这种辅助接口在可能的情况下与主类逻辑分开(当然,除非你的类主要关心的是比较)。

    使用非友元自由操作符和最小的公共接口可能更好。

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

如果你的类支持其他类型的隐式转换,那么将operator==设为好友,以支持在其第一个参数上进行隐式转换可能会很有用。

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