C++重载operator+实现同大小栈元素相加后结果栈无值问题
问题原因
- 核心错误是返回了局部对象的引用:你在
operator+函数内定义的res是栈上的局部变量,函数执行结束后该变量的内存会被系统回收,返回的引用属于悬空引用,访问该引用属于未定义行为,自然无法得到正确的st3值。 - 不符合加法运算符语义:你的
operator+实现会直接弹出this和otherStack的元素,执行st1 + st2后原有的st1和st2内容会被清空,完全不符合加法不修改操作数的常规逻辑。 - 结果栈顺序颠倒:直接将两个栈栈顶相加的结果压入结果栈,最终得到的结果栈元素顺序和预期的逐位相加顺序相反。
修复方案
首先调整operator+的设计:
- 返回值改为值类型而非引用,避免局部对象引用悬空问题
- 给参数和成员函数添加
const修饰,保证不修改原操作数 - 操作原栈的拷贝而非原栈本身,避免修改原有
st1、st2的内容 - 修正结果栈的元素顺序
修正后的operator+参考代码:
stack operator+(const stack& otherStack) const { // 拷贝原栈,避免修改原对象 stack a = *this; stack b = otherStack; stack temp_res; // 第一步:先将逐位相加的结果存入临时栈,此时顺序是反的 while ((!a.isEmpty()) && (!b.isEmpty())) { int sum = a.top() + b.top(); temp_res.push(sum); a.pop(); b.pop(); } // 第二步:将临时栈的元素倒序,得到正确顺序的结果栈 stack res; while (!temp_res.isEmpty()) { res.push(temp_res.top()); temp_res.pop(); } return res; }
只要你之前实现的拷贝构造函数和operator=逻辑正确,上述代码就可以正常运行,执行st3 = st1 + st2;后st3会得到对应位置相加的正确结果,且原有st1、st2的内容不会被修改。
内容的提问来源于stack exchange,提问作者Jim_Jimmadome
相关产品推荐
相关产品推荐

