我有一个分数班。
我需要对小数对象执行3次操作,即
可以通过重写Fraction Class *运算符来实现前两种情况。
ClassTaken
但是如何将整数乘以分数对象?第三种情况
任何建议?
PS:我不想将整数作为分数对象,例如(3/1),然后进行乘法运算。
答案 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