C++ C++;运算符==重载
可能重复:C++ C++;运算符==重载,c++,operator-overloading,C++,Operator Overloading,可能重复: 以下重载运算符==的方法之间有什么区别 // stroustrup way friend bool operator== (MyClass &lhs, MyClass &rhs); 及 哪种方式更好?这: friend bool operator== (MyClass &lhs, MyClass &rhs); bool MyClass::operator== (MyClass &rhs); 是一个函数,用于比较两个对象 这: boo
以下重载运算符==的方法之间有什么区别
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
及
哪种方式更好?这:
friend bool operator== (MyClass &lhs, MyClass &rhs);
bool MyClass::operator== (MyClass &rhs);
是一个函数,用于比较两个对象
这:
bool MyClass::operator== (MyClass &rhs);
是一个成员函数
您应该使用您的编码标准建议的编码,或者使用您喜欢的编码。没有比这更好的了。有些人(包括我自己)更喜欢将比较运算符作为函数,其他人更喜欢将其作为成员函数
顺便说一下,参数应该是
constmyclass&
类型。首先是外部友元函数(自由函数)
二是成员功能
bool MyClass::operator== (MyClass &rhs);
您应该始终使用第二种变体,然后才能使用
在下列情况下,应使用第一种变体:
1) 第一个参数是外部(库)类
(因为您的类无法了解比较运算符中可能需要的所有类)
参数应为常量:
friend bool operator==(const MyClass& lhs, const MyClass& rhs);
当第一个参数可以隐式构造时,这是首选的。例如,如果std::string
只有一个成员函数operator==
,那么“abc”==my_std_string
将不会调用它!但是,非成员函数可以通过从“abc”隐式构造一个字符串来调用(在这种特殊情况下更好的是,一个单独的bool操作符==(const char*,const std::string&)
可以出于性能原因提供,但这一点仍然存在——非成员函数有助于确保操作员在任一侧使用用户定义的类型)
另外,隐式构造函数有点危险,您需要仔细考虑使用它们的方便性和危险性
类似地,如果您有另一个类的objectofOtherClassType==objectofMyMassType,并且另一个类的使用了一个强制类型转换操作符,例如操作符MyClass()const
,那么非成员/朋友操作符=
将允许强制类型转换并能够进行比较;成员operator=
表单将不可用
最后一点:如果没有其他方法访问需要比较的数据,则只需将非成员操作符==
设置为朋友。否则,您可以在类外声明/定义它,如果您希望实现包含在标题中,则可以选择内联实现,该标题可能包含在最终链接到同一可执行文件的多个翻译单元中。不过,这并没有多大害处,让它成为朋友是将定义放入类模板中的唯一方法,您不必重复“模板”的内容和参数……您可以在以下内容中找到此问题的答案:)常见问题解答说“根据经验法则,二进制中缀比较运算符应该作为非成员函数实现”,但这并不能解释为什么存在这一规则-
friend ostream& operator<< (ostream &out, MyClass &m)
friend bool operator(const MyClass& my, const std::string& string_form)
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
friend bool operator==(const MyClass& lhs, const MyClass& rhs);