重载的构造函数都显示而不仅仅是目标构造函数

时间:2013-01-06 03:26:45

标签: c++ oop reference constructor constructor-overloading

在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()函数保留了原始分数而不是新值。

2 个答案:

答案 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;
}