运算符重载:成员函数 VS 非成员函数,仅涉及相同类型对象时

4
这个问题给出了一个很好的答案,解释为什么要将运算符重载定义为非成员函数:Operator overloading : member function vs. non-member function? 如果您将运算符重载函数定义为成员函数,则编译器会将表达式(如s1 + s2)翻译为s1.operator+(s2)。这意味着,运算符重载成员函数在第一个操作数上被调用。这就是成员函数的工作方式!
但是如果第一个操作数不是类呢?如果我们想要重载第一个操作数不是类类型(而是double等)的运算符,那么就会有一个主要问题。因此,您不能像这样写10.0 + s2。但是,您可以为s1 + 10.0这样的表达式编写运算符重载成员函数。
现在我遇到了一个需要重载operator==的情况。在我的情况下,只比较相同类型的对象。
在这种情况下,是否仍然有理由将operator==定义为非成员函数,还是应该实现为成员函数?

1
据你所知,只有相同类型的对象将在今天进行比较。你不知道未来。良好的风格永远是良好的风格。 - Richard Hodges
1个回答

3

由于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参数时产生的惊喜)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接