使用运算符重载实现整数计算器失败,求问题排查与修复方案
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
相关产品推荐
相关产品推荐

