You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++重载<<和>>运算符后程序可编译但无法接收输入如何解决

错误原因

你的代码核心问题出在输入运算符operator>>的参数定义上:
输入运算符的作用是修改传入的Fraction类对象的成员变量,所以你不能给第二个参数加const修饰。const修饰的引用代表该对象只读不可修改,强制修改const对象属于未定义行为,这就是你程序运行直接崩溃的原因。

修复步骤
  1. 修改类内operator>>的友元声明,移除参数的const修饰:
// 原声明
friend istream &operator>>(istream &in,const Fraction &f);
// 修改为
friend istream &operator>>(istream &in,Fraction &f);
  1. 修改类外operator>>的实现,同样移除参数的const修饰:
// 原实现
istream &operator>>(istream &in,const Fraction &f){
// 修改为
istream &operator>>(istream &in,Fraction &f){
补充优化建议

可以在输入完成后加一层分母为0的校验,避免后续运算出现除以0的异常,示例如下:

istream &operator>>(istream &in,Fraction &f){
    in>>f.m_numerator;
    in>>f.m_denominator;
    if(f.m_denominator == 0) {
        in.setstate(ios::failbit); // 标记输入失败
    }
    return in;
}
修正后完整可运行代码
#include<iostream>
#include<cmath>
using namespace std;
class Fraction{
    int m_numerator{0},m_denominator{1};
    public:
    Fraction(int numerator=0,int denominator=1):m_numerator{numerator},m_denominator{denominator}{
    }
   
    friend Fraction operator*(const Fraction &f1,const Fraction &f2);
    friend Fraction operator*(const Fraction &f,int n);
    friend Fraction operator*(int n,const Fraction &f);
    friend ostream &operator<<(ostream &out,const Fraction &f){
        out<<f.m_numerator<<'/'<<f.m_denominator;
        return out;
    }
    // 移除const修饰
    friend istream &operator>>(istream &in,Fraction &f);
};
// 移除const修饰
istream &operator>>(istream &in,Fraction &f){
    in>>f.m_numerator;
    in>>f.m_denominator;
    // 可选分母校验
    if(f.m_denominator == 0) {
        in.setstate(ios::failbit);
    }
    return in;
}
Fraction operator*(const Fraction &f1,const Fraction &f2){
    return Fraction{f1.m_numerator*f2.m_numerator,f1.m_denominator*f2.m_denominator};
}
Fraction operator*(const Fraction &f,int n){
    return Fraction(n*f.m_numerator,f.m_denominator);
}
Fraction operator*(int n,const Fraction &f){
    return Fraction(n*f.m_numerator,f.m_denominator);
}

int main(){
    Fraction f1;
    cin>>f1;
    if(cin.fail()) {
        cout<<"输入的第一个分数非法,分母不能为0"<<endl;
        return 1;
    }

    Fraction f2;
    cin>>f2;
    if(cin.fail()) {
        cout<<"输入的第二个分数非法,分母不能为0"<<endl;
        return 1;
    }

    std::cout << f1 << " * " << f2 << " is " << f1 * f2 << '\n'; 
    return 0;
}

内容的提问来源于stack exchange,提问作者Sanket Kittad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:39:03