在main中的对象使用Add()函数后,为什么Print()函数没有正确更新?
int main()
{
Rational myRational(3,5);
myRational.Print(); //Displays 3/5 as expected
myRational.Add(2);
myRational.Print(); //Displays 3/5 instead of 13/5
return 0;
}
//from Rational.cpp
//Overloaded constructors
Rational::Rational() :
num(0),
denom(1)
{
}
Rational::Rational(int n) :
num(n),
denom(1)
{
}
Rational::Rational(int n, int d) :
num(n),
denom(d)
{
}
Rational Rational::Add(const Rational& r1) const
{
int numerat = num * r1.getDenominator() +
denom * r1.getNumerator();
int denomin = denom * r1.getDenominator();
return Rational(numerat, denomin);
}
void Rational::Print()
{
cout << num << "/" << denom <<endl;
}
调试代码时,Add函数返回值13&amp; 5正如预期的那样,正确的构造函数也是如此。不幸的是,Print()函数保留了原始分数而不是新值。
答案 0 :(得分:3)
因为签名建议的方法Rational Rational::Add(const Rational& r1) const
及其实现方式不会修改调用它的对象,而是创建一个新的Rational
实例并返回它。
尝试:
myRational.Print(); //Displays 3/5 as expected
myRational = myRational.Add(2);
myRational.Print(); //Displays 3/5 instead of 13/5
提示:签名末尾有const
的事实意味着该方法不会修改调用它的实例的任何内容,这意味着这样的方法可以永远不要修改你所称的myRational
。
答案 1 :(得分:1)
此功能:
Rational Rational::Add(const Rational& r1) const
将结果返回给调用范围。您没有将结果存储在任何地方。因此,您获得了myRational
原始值。
尝试将值保存在对象中,然后打印。如果您想保留myRational
的原始内容,请尝试以下操作:
int main()
{
Rational myRational(3,5);
myRational.Print(); //Displays 3/5 as expected
Rational myRational2 = myRational.Add(2); //Result stored in new object
myRational2.Print(); //Printed new object values
return 0;
}