这个问题给出了一个很好的答案,为什么将运算符重载定义为非成员:运算符重载:成员函数与非成员函数?
如果将运算符重载函数定义为成员函数,则编译器会将s1 + s2之类的表达式转换为s1.operator +(s2)。这意味着,运算符重载的成员函数在第一个操作数上被调用。这就是成员函数的工作方式!
但是,如果第一个操作数不是类怎么办?如果我们想重载第一个操作数不是类类型,而是说double的运算符,则会出现一个主要问题。所以你不能这样写10.0 + s2。但是,您可以为诸如s1 + 10.0之类的表达式编写运算符重载成员函数。
现在我有一个需要超载的情况operator==
。在我的情况下,将仅比较(a)(b)同一类型的对象。
是否有理由仍然定义operator==
为非成员,或者在这种情况下我应该将其实现为成员?
由于operator==
其LHS和RHS参数具有对称语义,因此建议的方法是始终根据其操作数的公共接口将其实现为非成员(或者,如果需要私有数据,则将其声明为类中的朋友) )。
所以
class Bla
{
public:
// complete interface to data required for comparison
auto first();
auto second();
// ... more
private:
// data goes here
};
bool operator==(Bla const& L, Bla const& R)
{
return
std::forward_as_tuple(L.first(), L.second() /*, ... */) ==
std::forward_as_tuple(R.first(), R.second() /*, ... */)
;
}
这样,Bla
对L和R参数都考虑了隐式转换(我并不是说隐式转换是一个好主意,但如果有的话,最好避免仅在RHS参数中考虑它们的意外情况)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句