2

我有一个分数类如下。

class Fraction
{
  int num, den ;

  public:
   //member functions here
} ;

我在某本书中读到,我认为“有效的 C++”最好将加法运算符重载为非成员函数。给出的原因是它允许交换加法。这是我的加法运算符重载函数的原型。

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

在这里,当我调用它时,我必须这样做。

f1 + 2 ;

但它不会以这种方式工作。

2 + f1 ;

为此,我将不得不再次编写函数并更改其中的参数顺序。

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

4

4 回答 4

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

我无法想象你会想要禁止这种情况。

于 2012-08-26T14:38:08.790 回答
2

做这些事情:

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

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

  • 然后定义operator+() operator+=()

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

    请注意,这f1是按值传递的。所以你可以添加f2它,然后返回它。

有关详细答案,请参阅我对类似问题的回答:

于 2012-08-26T14:38:58.383 回答
1

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

于 2012-08-26T14:40:10.967 回答
0

You need either an implicit conversion or else a second operator definition, but it's completely possible to make the second definition reusable, so your code would look like this:

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);

Let me know if you want sample code for the commutative<T> class template.

于 2012-08-26T14:51:18.460 回答