Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;运算符==重载_C++_Operator Overloading - Fatal编程技术网

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);