运算符超载:成员与非会员当仅涉及相同类型的对象时

Operator overload: Member vs. non-member when only same type objects can be involved

本文关键字:同类型 对象 超载 成员 非会员 运算符      更新时间:2023-10-16

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

如果将操作员定义为成员函数,则 然后,编译器将S1 S2这样的表达式转换为 S1.EPERATOR (S2)。这意味着操作员超载成员功能 在第一台操作数上被调用。这就是成员功能的工作方式!

但是,如果第一操作数不是类?有一个主要问题 如果我们想超载第一操作数不是一个操作员 班级类型,而是说双重。所以你不能像这个10.0 那样写 S2。但是,您可以为操作员编写超载成员功能 S1 10.0等表达式。

现在,我有一个需要超载operator==的情况。就我而言,将比较(b)相同类型的对象。

是否有理由将operator==定义为非会员,或者我应该在这种情况下以成员的形式实现它?

,因为operator==具有其LHS和RHS参数的对称语义,因此推荐的方法是始终根据其操作数的公共界面(或者私人数据的公共接口)将其实现为非会员需要将其声明为班上的朋友)。

so

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参数)。