C++ 运算符==重载[重复]

问题描述 投票:0回答:3

可能重复:
运算符重载的基本规则和习惯用法是什么?

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

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

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

哪种方式更好?

c++ operator-overloading
3个回答
14
投票
// 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 ...>
”内容和参数....


9
投票

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

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)

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


6
投票

这个:

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

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

这个:

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

是一个成员函数。

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

顺便说一句,参数应该是

const MyClass &
类型。

© www.soinside.com 2019 - 2024. All rights reserved.