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

C++动态数组加号运算符重载求助:TProgram类数组合并代码异常

修复TProgram类的加号运算符重载问题

先梳理下你代码里导致功能失效的几个关键问题:

  • 变量名拼写错误:代码里出现了Larger.Ct(应该是Larger.kt)和Tp.kt[X](应该是Tv.kt[X],参数名是Tv),这会直接引发编译错误或者错误的内存访问。
  • 数组大小分配错误:合并两个数组时,新数组的容量应该是当前对象的Length加上传入对象的Tv.Length,只分配Length大小的话,根本装不下两个数组的元素,会触发数组越界。
  • 第二个循环逻辑完全错误:原循环从Tv.Length开始遍历到Length,完全取不到Tv里的任何元素,正确的逻辑应该是从0遍历到Tv.Length - 1,把Tv的所有元素追加进去。
  • 未更新新对象的Length成员:合并后的新对象Larger的Length必须设置为两个数组长度之和,否则后续使用这个对象时,无法知道实际的元素数量。

下面是修正后的完整代码,关键修改点我会做标注:

TProgram TProgram::operator+(const TProgram &Tv) const { 
    // 计算合并后的总元素数量
    int totalLength = Length + Tv.Length;
    TProgram Larger; 

    // 释放默认构造可能分配的内存(需确保默认构造把kt初始化为nullptr或有效指针)
    delete [] Larger.kt; 
    // 分配足够容纳两个数组的内存空间
    Larger.kt = new string[totalLength]; 

    int K = 0;
    // 复制当前对象的所有元素
    for(int Y = 0; Y < Length; Y++){ 
        Larger.kt[K++] = kt[Y]; 
    }
    // 复制传入对象Tv的所有元素(修正循环条件和变量名)
    for(int X = 0; X < Tv.Length; X++){ 
        Larger.kt[K++] = Tv.kt[X]; 
    }
    // 更新新对象的Length成员,确保后续使用时能正确获取元素数量
    Larger.Length = totalLength;

    return Larger; 
}

另外还有两个重要的细节需要注意:

  • 确保TProgram类的默认构造函数正确初始化kt(比如初始化为nullptr),否则delete [] Larger.kt可能会触发未定义行为。
  • 建议同时实现析构函数和赋值运算符重载,遵循C++的三/五法则,避免内存泄漏或者浅拷贝问题。比如析构函数里要执行delete [] kt;,赋值运算符要处理自我赋值、释放旧内存、分配新内存并完成元素复制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:32:44