【问题标题】:Proper way of overloading binary relational operators in C++ [duplicate]在 C++ 中重载二元关系运算符的正确方法 [重复]
【发布时间】:2017-03-24 20:57:37
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

没什么区别,除了那个

  • X 的实例需要位于等式运算符的左侧才能使成员版本起作用。如果你想写

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

    你需要一个非会员。

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

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

    使用非好友免费运算符和最小的公共界面可能会更好。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果我错了,请纠正我,但即使使用成员运算符也会进行隐式转换。
    • @BrunoFerreira 基本上,只有在参数列表中列出的参数才有资格进行隐式转换,但是当 operator== 是成员函数时,第一个参数是 this 并且它不符合隐式转换的条件。
    • 当然。 I made a small test case 是的,如果我删除隐式转换为 int 它将失败。
    • 仔细想想,成员函数是__thiscall,这意味着它有一个隐含的this作为第一个参数。在我的测试用例中,它应该类似于bool operator==(A* this, int x)。按照 C++ 标准,第一个参数是左侧,第二个参数是右侧。
    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2021-10-28
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多