我为我的大学作业写了一个理性的类(class)。
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
最佳答案
您尚未展示所有类(class),但我猜想会发生以下情况
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 的单参数构造函数,那么您版本的运算符>>(错误地采用 const 参数)将隐式地从分子和分母创建 Rational 对象。结果陷入无限循环。我已经将 Rational 构造函数调用添加到了上面的运算符 >> 中,以清楚地表明发生了什么。
此示例显示了当您具有单参数构造函数时在类型之间进行自动转换的危险。您可以使用关键字explicit 禁用此功能。
explicit Rational(int num);
但我想在这种情况下,大多数时候您可能希望从 int 到 Rational 自动转换。
关于c++ ->> 运算符重载函数无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16475542/