运算符重载非成员函数?

时间:2013-10-07 16:41:16

标签: c++ operator-overloading

我正在阅读Effective c++并遇到了这个问题:

class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);

此运营商是否超载?如果是,为什么它以奇怪的形式存在?

提前致谢。

2 个答案:

答案 0 :(得分:2)

  

此运营商是否超载?如果是的话,为什么它会以奇怪的形式出现?

是。表格不是“怪异”。这只是一种允许您将两个有理数相乘的形式。

操作符可以作为成员函数或非成员函数重载。使用非成员函数(如此)的主要优点是,您明确表示您没有访问Rational类的任何私有状态,也没有修改左侧操作数(也是由于const而明确。

仅当您要修改左侧操作数(this)或需要访问类型中的私有变量时才需要成员函数版本,这要求它成为类的一部分。否则,访问私有状态将要求将其声明为友元函数。

答案 1 :(得分:1)

这是常见的,也是个好主意。您通常根据其他运算符实现运算符,并尝试避免使用过多的成员函数。在你的情况下:

class Rational
{
public:
    // member function for += with access to the internals
    Rational& operator+=( const Rational& rhs );
};

// free function for + using public copy-ctor and +=,
// therefore no need to access internals of Rational
// and hence no need to be a member or friend of Rational!
Rational operator+( const Rational& lhs, const Rational& rhs )
{
    Rational result( lhs );
    result += rhs;
    return result;
}

由于第二种方法遵循一种通用模式,因此有一些库可以帮助您实现这一目标,例如: Boost.Operators或我的df.operators。在这些库的帮助下,您只需要

class Rational : df::commutative_addable< Rational >
{
public:
    // member function for += with access to the internals
    Rational& operator+=( const Rational& rhs );
};

自动生成+。