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

拷贝构造函数显式赋值报错:重载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:23:43