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

标签 c++ operator-overloading binary-operators relational-operators

<分区>

在 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);
    

    你需要一个非成员(member)。

  • 如果您要实现所有二元关系运算符,那么您的类的表面积可能会大大增加。

    我通常更喜欢尽可能将这种辅助接口(interface)与主类逻辑分开(当然,除非您的类主要关注的是比较)。

    使用非友元免费运算符和最小的公共(public)接口(interface)可能会更好。

关于c++ - 在 C++ 中重载二元关系运算符的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40534245/

相关文章:

java - 如何定义unix权限常量(READ、WRITE、EXECUTE)

C反向二进制

c++ - 在子类 C++ 字符串中重载 []

c++ - 为什么需要运算符重载?

c++ - 关于应该如何调用返回仿函数_support_ 的成员函数,是否存在或多或少达成一致的约定?

c++ - 如何完美转发结构体成员?

c++ - 重载类型转换运算符的语法

java - 什么是 | Java 中的运算符在做什么?

c++ - 如何使用 C++ 在 linux 中读取当前正在运行的进程列表

c++ - 如何用无限循环停止QThread