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
相关产品推荐
相关产品推荐

