我为我的大学作业写了一个理性的课程。
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
答案 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的自动转换。