1

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

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

这个运算符重载了吗?如果是,为什么它的形式很奇怪?

提前致谢。

4

2 回答 2

2

这个运算符重载了吗?如果是,为什么它的形式很奇怪?

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

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

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

于 2013-10-07T16:44:28.810 回答
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 );
};

自动为您生成 +。

于 2013-10-07T16:47:40.590 回答