如何在C ++中用分数对象乘整数常量

时间:2018-11-12 11:01:06

标签: c++ c++11 c++14

我有一个分数班。

我需要对小数对象执行3次操作,即

  1. 将两个小数对象相乘。例如F1 * F2
  2. 将Fraction对象乘以整数。对于前。 F1 * 3
  3. 将整数与小数对象相乘。对于前。 3 * F1。

可以通过重写Fraction Class *运算符来实现前两种情况。

ClassTaken

但是如何将整数乘以分数对象?第三种情况

任何建议?

PS:我不想将整数作为分数对象,例如(3/1),然后进行乘法运算。

3 个答案:

答案 0 :(得分:4)

您需要将运算符重载实现为自由函数,如下所示:

Fraction operator *(int lhs, Fraction rhs)
{
     rhs *= lhs;

     return rhs;
}

请注意,我已经根据Fraction::operator*=(int)实现了该功能(请参阅here,为什么这被认为是好的做法)。如果不存在此功能,则可能需要将第二个参数作为const Fraction& rhs传递并提供其他实现。

此外,请注意,处理这种情况的惯用方式是允许通过单个Fraction参数隐式构造int实例,因此您的约束对我来说似乎有点尴尬。还要注意,您的Fraction类的用户可能希望所有算术运算都是可能的(为什么应该有operator*而不是operator/?)。为了减少在这种情况下要编写的手动代码量,boost operator library可能会很有帮助。

答案 1 :(得分:3)

我可以为就地好友功能辩护吗?

在c ++ 11中,您可以在类中声明并编写您的friend函数,这可以使其更加整洁:

class MyNumber
{
private:
  Clever c;
  Clever Multiply (Clever, i) { ... }
public:
  MyNumber operator * (int i)const { return Multiply(c,i)  }
  MyNumber operator * (const MyNumber &i)const { ...  }
  const MyNumber& operator *= (int i) { return c= Multiply(c, i);  }
  // introducing the inline friend (presuming multiply is commutative/symmetric here)
  friend MyNumber operator (int i, const MyNumber& j) { return j.Multiply(c,i);  }
};

请注意,此朋友函数实际上仍然是全局函数,并且可以访问类的内部,但是现在其实现在类定义中比较整洁。

这种样式的简洁之处在于,即使我实际上不需要肮脏的朋友访问权限,我也很想使用它。

对于这些数学重载对象,还应考虑RValue替换重载。二进制乘法的右值实现作为多分配可以显示出一些效率,尽管对于只有两个值的分数类来说可能不是很多。

答案 2 :(得分:0)

重载运算符有三种不同的方式:成员函数方式,朋友函数方式和普通函数方式。

在这种情况下,我们需要以友好函数的方式重载运算符。

friend Fraction operator*(const Fraction &a, const Fraction &b);   //F1*F2
friend Fraction operator*(const Fraction &a, int b);               //F1*3
friend Fraction operator*(int a, const Fraction &b);               //3*F1