概述
在掌握 string 接口后,我们尝试从零实现一个完整的 string 类。为了避免与标准库冲突,这里使用 mystd 命名空间封装。
核心成员与迭代器
类内部主要维护三个私有成员:
_str: 指向动态分配的字符数组。_size: 当前有效字符长度(不含\0)。_capacity: 当前分配的总容量(不含\0)。 此外定义npos为无符号整型最大值,用于表示查找失败等异常状态。 迭代器直接复用指针类型别名,iterator对应char*,const_iterator对应const char*。
默认成员函数实现
构造函数
无参构造时,需预留一个 \0 作为空串标识,此时 _size 和 _capacity 均为 0。带参构造则根据传入 C 字符串长度计算所需空间,注意额外分配一位给终止符。
// 无参构造
string() : _str(new char[1]{'\0'}), _size(0), _capacity(0) {}
// 带参构造
string(const char* str) {
_size = strlen(str);
_capacity = _size;
_str = new char[_capacity + 1];
strcpy(_str, str);
}
注:初始化列表顺序遵循成员声明顺序,但此处为了复用 strlen 结果,直接在函数体内计算更为直观。
析构函数
释放动态内存并重置状态。
~string() {
delete[] _str;
_size = 0;
_capacity = 0;
}
深拷贝与赋值策略
拷贝构造函数
浅拷贝会导致多个对象共享同一块内存,析构时引发重复释放错误。必须实现深拷贝,为新对象独立分配内存并复制内容。
传统写法如下:
string(const string& s) : _size(s._size), _capacity(s._size) {
_str = new [_capacity + ];
(_str, s._str);
}


