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

C++重载operator+实现同大小栈元素相加后结果栈无值问题

问题原因
  • 核心错误是返回了局部对象的引用:你在operator+函数内定义的res是栈上的局部变量,函数执行结束后该变量的内存会被系统回收,返回的引用属于悬空引用,访问该引用属于未定义行为,自然无法得到正确的st3值。
  • 不符合加法运算符语义:你的operator+实现会直接弹出this和otherStack的元素,执行st1 + st2后原有的st1和st2内容会被清空,完全不符合加法不修改操作数的常规逻辑。
  • 结果栈顺序颠倒:直接将两个栈栈顶相加的结果压入结果栈,最终得到的结果栈元素顺序和预期的逐位相加顺序相反。
修复方案

首先调整operator+的设计:

  1. 返回值改为值类型而非引用,避免局部对象引用悬空问题
  2. 给参数和成员函数添加const修饰,保证不修改原操作数
  3. 操作原栈的拷贝而非原栈本身,避免修改原有st1、st2的内容
  4. 修正结果栈的元素顺序

修正后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:54:06