22

可能重复:
运算符重载

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

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

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

哪种方式更好?

4

3 回答 3

11
// 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 == ObjectOfMyClassType,并且AnotherClass使用了诸如 之类的演员表操作符operator MyClass() const,那么非会员/朋友operator==将允许演员表参与并能够进行比较;会员operator==表格不会。

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

于 2012-04-09T07:27:34.457 回答
7

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

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)

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

于 2012-04-09T07:16:29.137 回答
5

这个 :

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

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

这个 :

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

是成员函数。

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

顺便说一句,参数应该是const MyClass &类型。

于 2012-04-09T07:05:26.000 回答