重载operator - ()作为自由函数而不是成员函数的意义?

Abh*_*pta 9 c++ operator-overloading

我正在阅读C++ FAQ.在那里我发现操作符重载使用指南中有一点:

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

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

如果我将operator-()作为成员函数以及其他后果会有什么不良后果?

K-b*_*llo 16

以下是Fraction运算符作为成员函数:

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

    Fraction operator -( Fraction const& right ) const { ... }
};
Run Code Online (Sandbox Code Playgroud)

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

Fraction x;
Fraction y = x - 42;
Run Code Online (Sandbox Code Playgroud)

和它相当于x.operator-( Fraction(42) ); 但这不是:

Fraction z = 42 - x;
Run Code Online (Sandbox Code Playgroud)

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

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

Fraction z = 42 - x;
Run Code Online (Sandbox Code Playgroud)

变成这个

Fraction z = Fraction(42) - x;
Run Code Online (Sandbox Code Playgroud)

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

  • 导致构造新对象的所有运算符.在这种情况下,例如' - '运算符. (2认同)