【问题标题】:Operator overload: Member vs. non-member when only same type objects can be involved运算符重载:当只能涉及相同类型的对象时,成员与非成员
【发布时间】:2015-07-12 01:21:01
【问题描述】:

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

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

但是如果第一个操作数不是类怎么办?有一个大问题 如果我们想重载一个第一个操作数不是 类类型,而不是说双。所以你不能这样写 10.0 + s2。但是,您可以为 像 s1 + 10.0 这样的表达式。

现在我遇到需要重载operator== 的情况。在我的例子中,只会比较 (a) (b) 相同类型的对象

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

【问题讨论】:

  • 据您所知,今天只会比较相同类型的对象。你不知道未来。好风格就是好风格。

标签: c++ operator-overloading


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多