这个问题很好地解释了为什么将运算符重载定义为非成员:Operator overloading : member function vs. non-member function?
如果将运算符重载函数定义为成员函数, 然后编译器将表达式转换为s1 + s2 s1.operator +(S2)。这意味着,运算符重载了成员函数 在第一个操作数上调用。这就是成员函数的工作方式!
但是如果第一个操作数不是一个类怎么办?这是一个主要问题 如果我们想要重载第一个操作数不是a的运算符 类类型,而不是说双重。所以你不能写这样10.0 + S2。但是,您可以编写运算符重载的成员函数 表达式如s1 + 10.0。
现在我需要重载operator==
。在我的情况下,仅比较(a)(b)相同类型的对象。
是否仍有理由将operator==
定义为非会员,还是应该在此情况下将其作为会员实施?
答案 0 :(得分:2)
因为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() /*, ... */)
;
}
这样,对于L和R参数都考虑隐式转换为Bla
(我不是说隐式转换是一个好主意,但如果你有这些转换,它会更好避免意外,只考虑RHS论点。