运算符重载:仅可包含相同类型对象的成员与非成员

麦可

这个问题给出了一个很好的答案,为什么将运算符重载定义为非成员:运算符重载:成员函数与非成员函数?

如果将运算符重载函数定义为成员函数,则编译器会将s1 + s2之类的表达式转换为s1.operator +(s2)。这意味着,运算符重载的成员函数在第一个操作数上被调用。这就是成员函数的工作方式!

但是,如果第一个操作数不是类怎么办?如果我们想重载第一个操作数不是类类型,而是说double的运算符,则会出现一个主要问题。所以你不能这样写10.0 + s2。但是,您可以为诸如s1 + 10.0之类的表达式编写运算符重载成员函数。

现在我有一个需要超载的情况operator==在我的情况下,将仅比较(a)(b)同一类型的对象

是否有理由仍然定义operator==为非成员,或者在这种情况下我应该将其实现为成员?

TemplateRex

由于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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章