C ++运算符==重载
可能重复:
运算符超载
下面的方式来重载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&)
,但这一点仍然存在 - 非成员函数可以帮助确保操作员在任一侧使用用户定义类型)。
另外,隐含的构造函数有点危险 - 你想要考虑使用它们的便利性和危险性。
最后一点:如果没有其他方式可以访问需要比较的数据,则只需将非会员operator==
设为friend
即可。 否则,您可以在类外部声明/定义它,如果希望在可能包含在最终链接到同一个可执行文件中的多个翻译单元的标题中实现,可以选择内联。 尽管没有太大的伤害,并且使它成为朋友是将定义放入类模板中的唯一方法,您不必重复“模板”内容和参数....
首先是外部朋友功能(免费功能)
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 &
type。