13

我正在阅读C++ 常见问题解答。在那里,我在运算符重载使用指南中找到了一点:

如果您提供构造运算符,它们应该允许提升左侧操作数(至少在类具有未使用显式关键字标记的单参数 ctor 的情况下)。例如,如果您的 Fraction 类支持从 int 到 Fraction 的提升(通过非显式 ctor Fraction::Fraction(int)),并且如果您允许两个 Fraction 对象使用 x - y,则还应该允许 42 - y。实际上,这仅仅意味着您的 operator-() 不应该是 Fraction 的成员函数。通常,如果出于强制公开的原因,您会使其成为朋友:班级的一部分,但即使它不是朋友,也不应该成为会员。

为什么作者写了 operator-() 不应该是成员函数?

如果我将 operator-() 作为成员函数会有什么不好的后果,还有什么其他后果?

4

1 回答 1

19

这是Fraction将运算符作为成员函数:

class Fraction
{
    Fraction(int){...}

    Fraction operator -( Fraction const& right ) const { ... }
};

有了它,这是有效的代码:

Fraction x;
Fraction y = x - 42;

及其等价于x.operator-( Fraction(42) ); 但这不是:

Fraction z = 42 - x;

因为它里面42没有成员函数(当然,它甚至不是一个类)operator -

但是,如果您将运算符声明为自由函数,则转换操作适用于它的两个参数。所以这

Fraction z = 42 - x;

变成了这个

Fraction z = Fraction(42) - x;

这相当于operator-( Fraction(42), x )

于 2012-06-09T05:44:15.570 回答