>>运算符重载函数无限递归

时间:2013-05-10 05:08:22

标签: c++ class io operator-overloading

我为我的大学作业写了一个理性的课程。

class Rational
{
    friend std::istream &operator >>(std::istream &, const Rational &);
    friend std::ostream &operator <<(std::ostream &, const Rational &);
public:
    ...
private:
    int numerator;
    int denominator;
}

istream &operator >>(istream &istm, const Rational &num){
    istm>>num.numerator>>num.denominator;
    return istm;
}
然而,

&gt;&gt;重载函数似乎无限循环。核心转储...

我很快发现我偶然为Ratoinal&amp; num添加了“const”。

我的问题是为什么

istm>>num.numerator>>num.denominator;

成功编译但成为无限循环?

请解释以下结果......谢谢

const int i;
cin>>i;  //compile error

int c;
const int &a=c;
cin>>a;  //pass

1 个答案:

答案 0 :(得分:3)

你没有展示你所有的课程,但我猜想以下情况正在发生

class Rational
{
    friend std::istream& operator>>(std::istream&, const Rational&);
    friend std::ostream& operator<<(std::ostream&, const Rational&);
public:
    Rational(int num);
    ...
private:
    int numerator;
    int denominator;
};

istream& operator>>(istream& istm, const Rational& num)
{
    istm >> Rational(num.numerator) >> Rational(num.denominator);
    return istm;
}

假设你的Rational类有一个带有int的一个arg构造函数,那么你的版本运算符&gt;&gt;,错误地接受一个const参数,将隐式地从分子和分母创建Rational对象。结果是无限循环。我已将Rational构造函数调用添加到运算符&gt;&gt;以上是为了清楚说明发生了什么。

此示例显示了具有one-arg构造函数时类型之间自动转换的危险。您可以使用关键字explicit。

来禁用此功能
    explicit Rational(int num);

但我想在这种情况下你可能想要在大多数时候从int到Rational的自动转换。