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

使用运算符重载实现整数计算器失败,求问题排查与修复方案

C++整数计算器代码问题分析与修复

问题梳理

代码出现的编译错误对应以下核心问题:

  • 缺少默认构造函数:自定义带参构造函数后,编译器不再自动生成无参默认构造函数,导致Number tmp;、Number real1, real2, lastsum;这类无参实例化代码无法编译。
  • 私有成员越权访问:类的i成员属于private属性,main函数中直接访问real1.i、real2.i违反C++封装规则。
  • 输入方法误用:getline用于读取字符串,不能直接读取int类型变量,读取整数应使用cin >>。
  • 运算符重载实现不合理:创建临时对象时调用了不存在的默认构造函数,正确做法是直接通过带参构造初始化临时对象。

修复后的代码

#include <iostream>
using namespace std;

class Number {
    int i;
public:
    // 添加默认构造函数,初始化成员为0
    Number() : i(0) {}
    // 带参构造函数,使用初始化列表优化
    Number(int num) : i(num) {}
    
    void show();
    // 运算符重载优化:参数用const引用提升效率,直接返回构造的临时对象
    Number operator+(const Number& op2) const;
    
    // 提供setter方法,用于设置私有成员变量
    void setValue(int num) {
        i = num;
    }
};

void Number::show() {
    cout << "result is " << i << endl;
}

Number Number::operator+(const Number& op2) const {
    // 直接通过带参构造创建并返回结果对象,无需默认构造
    return Number(this->i + op2.i);
}

int main() {
    int num1, num2;
    Number real1, real2, lastsum;

    cout << "first integer" << endl;
    cin >> num1;
    real1.setValue(num1);

    cout << "second integer" << endl;
    cin >> num2;
    real2.setValue(num2);

    lastsum = real1 + real2;
    lastsum.show();
}

关键修改说明

  • 补充默认构造函数:添加Number() : i(0) {},解决无参实例化对象的编译错误。
  • 新增setValue方法:通过公共方法设置私有成员,避免直接访问private变量,符合封装原则。
  • 修正输入逻辑:用cin >>读取整数,再通过setValue赋值给对象,替代错误的getline调用。
  • 优化运算符重载:直接通过带参构造创建临时结果对象,同时将参数改为const Number&减少不必要的拷贝,提升代码效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:04:50