重载运算符的意义 - ()作为自由函数&不是会员功能?

时间:2012-06-09 05:40:55

标签: c++ operator-overloading

我正在阅读the C++ FAQ。我在指南中找到了操作符重载使用的一点:

  

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

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

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

1 个答案:

答案 0 :(得分:16)

以下是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 )