所以我为具有变量num和den的fraction类编写了这个重载函数。
fraction operator +(fraction & f1, fraction & f2)
{
fraction temp;
temp.num = (f1.num * f2.den ) + ( f1.den * f2.num );
temp.den = (f1.den * f2.den );
return temp;
}
如果我使用这个代码作为f1 = f1+f2
,它运行得很好。但我想把它用作f1 = f2+fraction(3,4)
如果我尝试以这种方式使用它,它会向fraction和fraction显示无效的操作数。有人能识别出这种错误以及为什么会发生这种错误吗。提前谢谢。
类型fraction&
需要传递的参数必须是左值(地址为你可以采取)类型的fraction
。但fraction(3,4)
是一个临时对象,而不是左值,因此不能通过引用传递。
但const fraction &
不需要左值,可以使用临时变量作为值。
f1
和f2
在operator +
中不会更改,因此您可以也应该将参数声明更改为const &
,这允许通过引用传递临时对象。
fraction operator +(const fraction & f1, const fraction & f2)
我通常会根据+=
编写一个+
运算符。例如:
// member function
fraction &fraction::operator +=(const fraction &f2)
{
num = num * f2.den + den * f2.num;
den *= f2.den;
}
// non-member function
inline fraction operator+(fraction lhs, const fraction& rhs)
{
lhs += rhs;
return lhs;
}
注意,在第二个函数中,lhs
不是引用,而是传递的fraction
的副本。它是由函数返回的副本的修改版本。非成员函数几乎总是可以这样写的。