可能重复:
运算符重载的基本规则和习惯用法是什么?
以下重载operator==的方式有什么区别?
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
和
// as taught in other places, including caltech
bool MyClass::operator== (MyClass &rhs);
哪种方式更好?
// 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==
设为 friend
即可。否则,您可以在类外部声明/定义它,如果您希望在标头中实现,该标头可能包含在最终链接到同一可执行文件中的多个翻译单元中,则可以选择 inline
。不过也没什么坏处,将其设为 friend
是将定义放入类模板中的唯一方法,这样您就不必重复“template <typename ...>
”内容和参数....
首先是外部好友功能(免费功能)
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)
(因为您的类无法了解比较运算符中可能需要的所有类)
这个:
friend bool operator== (MyClass &lhs, MyClass &rhs);
是一个函数,用于比较两个对象。
这个:
bool MyClass::operator== (MyClass &rhs);
是一个成员函数。
您应该使用您的编码标准建议的一种,或者使用您喜欢的一种。没有一个更好。有些人(包括我自己)更喜欢将比较运算符作为函数,其他人更喜欢将其作为成员函数。
顺便说一句,参数应该是
const MyClass &
类型。