运算符重载:当只涉及相同类型的对象时,成员与非成员

时间:2015-05-02 08:09:09

标签: c++ operator-overloading

这个问题很好地解释了为什么将运算符重载定义为非成员:Operator overloading : member function vs. non-member function?

  

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

     

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

现在我需要重载operator==。在我的情况下,仅比较(a)(b)相同类型的对象。

是否仍有理由将operator==定义为非会员,还是应该在此情况下将其作为会员实施?

1 个答案:

答案 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论点。