0

为什么在 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 和 5,正确的构造函数也会返回。不幸的是,Print() 函数保留了原始分数而不是新值。

4

2 回答 2

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您调用它的实例。

于 2013-01-06T03:30:40.630 回答
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;
}
于 2013-01-06T03:30:20.143 回答