我正在阅读Effective c++并遇到了这个:
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
这个运算符重载了吗?如果是,为什么它的形式很奇怪?
提前致谢。
我正在阅读Effective c++并遇到了这个:
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
这个运算符重载了吗?如果是,为什么它的形式很奇怪?
提前致谢。
这个运算符重载了吗?如果是,为什么它的形式很奇怪?
是的。形式并不“奇怪”。这只是允许您将两个有理数相乘的一种形式。
运算符可以作为成员函数或非成员函数重载。使用非成员函数(像这样)的主要优点是您明确表示您没有访问Rational
类的任何私有状态,也没有修改左侧操作数(const
由于.
仅当您要修改左侧操作数 ( this
) 或需要访问类型中的私有变量时才需要成员函数版本,这要求它是类的一部分。否则,访问私有状态需要将其声明为友元函数。
这很常见,也是个好主意。您通常根据其他运算符来实现运算符,并尽量避免拥有过多的成员函数。在你的情况下:
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 );
};
自动为您生成 +。