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

标签 c++ class io operator-overloading

我为我的大学作业写了一个理性的类(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/

相关文章:

c++ - 将 .mat 文件从 MATLAB 转换为 OpenCV 中的 cv::Mat 矩阵

c++ - 封闭类的模板参数的默认参数

python - 使用C++项目(Visual Studio)中的参数调用Python函数

python - 自动将对象从类转换为子类

java - 为什么有两种不同的方式来创建内部类的实例?

java - 如何创建一个类并添加到 for 循环中的列表中接收来自控制台的输入

c++ - 有效的 ARM 可执行文件找不到库

c++ - 为什么隐式声明不引入名称?

java读写构造

C++ 字符串在 int 时不连接 char,即使它是 char