【问题标题】:C++ operator== overloading [duplicate]C ++运算符==重载[重复]
【发布时间】:2012-04-21 15:18:30
【问题描述】:

可能重复:
Operator overloading

以下重载 operator== 的方式有什么区别?

// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs); 

// as taught in other places, including caltech
bool MyClass::operator== (MyClass &rhs);

哪种方式更好?

【问题讨论】:

标签: c++ operator-overloading


【解决方案1】:
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);

参数应该是const:

friend bool operator==(const MyClass& lhs, const MyClass& rhs);

这是首选,因为它在第一个参数可以隐式构造时起作用。例如,如果std::string 只有一个成员函数operator==,那么"abc" == my_std_string 就不会调用它!但是,可以通过从“abc”隐式构造一个字符串来调用非成员函数(更好的是,在这种特殊情况下,出于性能原因,可以提供单独的bool operator==(const char*, const std::string&),但重点仍然存在——非成员函数可以帮助确保操作员在任一侧使用用户定义的类型)。

另外,隐式构造函数有点危险 - 您需要认真考虑使用它们的便利与危险。

类似地,如果您有 ObjectOfAnotherClassType == ObjectOfMyClassTypeAnotherClass 使用诸如 operator MyClass() const 之类的演员表操作符,那么非会员/朋友 operator== 将允许演员表参与并能够进行比较;成员operator== 表单不会。

最后一点:如果没有其他方法可以访问您需要比较的数据,您只需将非会员operator== 设为friend。否则,您可以在类之外声明/定义它,可选inline,如果您希望在可能包含从最终链接到同一个可执行文件的多个翻译单元的标头中实现。不过没有太大危害,将其设为friend 是将定义放入类模板的唯一方法,您不必重复“template <typename ...>”的内容和参数......

【讨论】:

    【解决方案2】:

    首先是外部好友功能(免费功能)

    friend bool operator== (MyClass &lhs, MyClass &rhs); 
    

    二是成员函数

    bool MyClass::operator== (MyClass &rhs);
    

    你应该总是使用第二个变体,然后你可以

    您应该使用第一个变体,以防万一: 1) 第一个参数是外部(库)类

    friend ostream& operator<< (ostream &out, MyClass &m)
    

    2)算子的逻辑与你的类无关,必须单独实现

    friend bool operator(const MyClass& my, const std::string& string_form)
    

    (因为您的班级无法了解比较运算符中可能需要的所有类)

    【讨论】:

      【解决方案3】:

      这个:

      friend bool operator== (MyClass &lhs, MyClass &rhs); 
      

      是一个函数,它比较两个对象。

      这个:

      bool MyClass::operator== (MyClass &rhs);
      

      是一个成员函数。

      您应该使用您的编码标准建议的那一种,或者使用您喜欢的那一种。没有一个更好。有些人(包括我自己)更喜欢将比较运算符作为函数,而另一些人则更喜欢将其作为成员函数。

      顺便说一下,参数应该是const MyClass &amp;类型的。

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 2012-12-22
        • 2016-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 2016-06-27
        • 2020-01-14
        相关资源
        最近更新 更多