拷贝构造函数显式赋值报错:重载operator+拼接字符串未达预期
C++自定义字符串类:operator+重载与拷贝构造函数问题
看起来你在实现自定义字符串类时遇到了两个关键问题:重载operator+做字符串拼接后显式赋值得不到预期结果,同时拷贝构造函数里显式赋值时出错。先看看你给出的代码片段(我补全了未写完的<=运算符声明):
#include <iostream> #include <cstring> using namespace std; class st{ char *p; int len; public: st(){len=0; p=0;} //创建空字符串 st(const char *s); //从数组创建字符串 st(const st &s); //拷贝构造函数 ~st(){delete p;} //析构函数 //+运算符 friend st operator + (const st &, const st &); //<=运算符 friend int operator <= (const st &, const st &); };
我梳理了几个大概率导致你问题的核心原因,同时给出对应的修复方案:
1. 拷贝构造函数的浅拷贝陷阱
你只声明了拷贝构造函数但未实现,编译器会自动生成默认的拷贝构造函数——它只会做浅拷贝:直接复制指针p的地址,而不是分配新内存去拷贝字符串内容。这样两个对象会指向同一块内存,当其中一个对象析构释放内存后,另一个对象再操作就会触发未定义行为(比如崩溃、输出乱码)。
正确的深拷贝实现:
st::st(const st &s) { len = s.len; // 分配新内存(+1是为了存储字符串结束符'\0') p = new char[len + 1]; strcpy(p, s.p); }
2. operator+的实现缺失/错误
你声明了友元operator+但没给出实现,正确的拼接逻辑需要:
- 计算两个字符串拼接后的总长度
- 分配足够的内存空间
- 依次拷贝两个字符串的内容
- 返回新创建的字符串对象
示例实现:
st operator + (const st &s1, const st &s2) { st temp; temp.len = s1.len + s2.len; temp.p = new char[temp.len + 1]; strcpy(temp.p, s1.p); strcat(temp.p, s2.p); return temp; }
3. 缺少赋值运算符(operator=)重载
当你做显式赋值(比如st a = b + c;或a = b;)时,默认的赋值运算符同样是浅拷贝,会导致和拷贝构造函数一样的内存问题。必须重载operator=实现深拷贝:
st& st::operator=(const st &s) { // 先处理自我赋值的情况,避免重复释放内存 if (this == &s) { return *this; } // 释放当前对象已占用的内存 delete[] p; // 深拷贝内容 len = s.len; p = new char[len + 1]; strcpy(p, s.p); return *this; }
4. 补全其他未实现的成员函数
你声明了const char*参数的构造函数但未实现,它需要把C风格字符串拷贝到类的内存中:
st::st(const char *s) { len = strlen(s); p = new char[len + 1]; strcpy(p, s); }
如果需要方便输出字符串,建议重载operator<<:
ostream& operator<<(ostream &os, const st &s) { os << s.p; return os; }
测试示例
补全所有代码后,你可以用以下代码验证功能:
int main() { st s1("Hello"); st s2(" World"); st s3 = s1 + s2; cout << s3 << endl; // 输出:Hello World return 0; }
总结一下:你的问题核心是浅拷贝导致的内存管理混乱,拷贝构造函数、赋值运算符必须实现深拷贝,同时operator+要正确分配内存并完成字符串拼接。
内容的提问来源于stack exchange,提问作者Tarun Jha
相关产品推荐
相关产品推荐

