将加法运算符作为非成员函数重载是否更好?

时间:2012-08-26 14:33:21

标签: c++ oop operator-overloading addition

我有一个Fraction类如下。

class Fraction
{
  int num, den ;

  public:
   //member functions here
} ;

我读了一些书,我认为'有效的c ++'最好将加法运算符重载为非成员函数。给出的原因是它允许交换加法。 这是我为加法运算符重载函数的原型。

Fraction operator + (const Fraction &obj, const int add_int) ;

在这里,当我打电话时,我必须这样做。

f1 + 2 ;

但它不会这样。

2 + f1 ;

为此,我必须再次编写该函数并更改其中的参数顺序。

我想知道是否有一种方法可以让我一次重载函数并执行可交换的添加?

4 个答案:

答案 0 :(得分:5)

您可以,但前提是您的类具有要添加的类型的隐式构造函数,因此这样可以使用:

class Fraction
{
    int num, den;

public:
    Fraction(int n) :num(n), den(1) {}

    // member functions here
};

Fraction operator+(Fraction lhs, Fraction rhs) { ... }

int main()
{
    Fraction f1(5);
    f1 = f1 + 5;
    f1 = 5 + f1;
}

当然,这允许您实际上没有提到的用法,即添加两个Fraction对象的能力。

Fraction f1(1), f2(2);
Fraction f3 = f1 + f2

我无法想象你会想要不允许这样做。

答案 1 :(得分:2)

做这些事情:

  • 定义构造函数Fraction(int)以启用从intFraction的隐式转换。

  • operator+=()定义为成员函数。

  • 然后根据 operator+()operator+=() 定义为:

    Fraction operator+(Fraction f1, Fraction const & f2)
    {
        f1 += f2;  //call `operator+=` member function
        return f1;
    }
    

    请注意,f1按值传递。因此,您可以向其添加f2,然后将其返回。

有关详细解答,请在此处查看我的答案,提出类似的问题:

答案 2 :(得分:1)

没有没有语法结构,因为+ -operator是每个定义在c ++中不可交换的。这意味着您必须定义第二个版本,但是在实现中调用带有交换参数的第一个版本是合理的。

答案 3 :(得分:0)

您需要隐式转换或第二个运算符定义,但完全可以使第二个定义可重用,因此您的代码将如下所示:

class Fraction : public commutative<Fraction>
{
  int num, den ;

  friend Fraction operator+ (int add_int, Fraction obj);
public:
   //member functions here
};
Fraction operator+ (int add_int, Fraction obj);

如果您需要commutative<T>类模板的示例代码,请告诉我。