2

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

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

然而 >> 重载函数似乎无限循环。然后核心转储...

我很快发现我偶然在 Ratoinal &num 中添加了“const”。

我的问题是为什么

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

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

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

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

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

1 回答 1

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 的单参数构造函数,那么您的 operator>> 版本错误地采用 const 参数,将隐式地从分子和分母创建 Rational 对象。结果是无限循环。我在上面的 operator>> 中添加了 Rational 构造函数调用,以明确发生了什么。

这个例子展示了当你有一个单参数构造函数时在类型之间进行自动转换的危险。您可以使用关键字显式禁用此功能。

    explicit Rational(int num);

但我想在这种情况下,您可能希望大部分时间自动从 int 转换为 Rational。

于 2013-05-10T05:33:00.810 回答