C ++运算符==重载

C++ operator== overloading

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Operator overloading

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

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

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

哪条路更好?


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

参数应为const

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

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

另外,隐式构造器有点危险——您希望仔细考虑使用它们的方便性和危险性。

最后一点:如果没有其他方法访问需要比较的数据,您只需要使非成员operator==成为friend。否则,您可以在类外部声明/定义它,如果您希望在一个头部中包含实现,则可以选择内联,该头部可能来自多个翻译单元,最终链接到同一个可执行文件中。不过危害不大,把它变成朋友是把定义放在类模板中的唯一方法,在这里你不必重复"模板"的内容和参数……


首先是外部朋友功能(自由功能)

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

二是成员函数

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

您应该始终使用第二个变量,然后您可以

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

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

2)运算符逻辑与类无关,必须单独实现

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

(因为您的类不能完全了解比较运算符中可能需要的类)


这是:

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

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

这是:

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

是成员函数。

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

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