1. 手写C++ string类的设计与实现
在C++编程中,string类是最基础也是最常用的类之一。虽然标准库提供了完善的string实现,但自己动手实现一个简化版的string类,对于理解内存管理、运算符重载和类设计等核心概念非常有帮助。本文将详细解析一个自定义string类的完整实现过程。
1.1 基础结构设计
我们的string类需要包含三个核心成员变量:
char* _arr:指向动态分配的字符数组int _size:当前字符串长度int _cap:当前分配的容量
cpp复制class string {
private:
char* _arr = nullptr;
int _cap = 0;
int _size = 0;
};
这种设计与标准库的string类似,但做了简化。_size表示当前字符串的实际长度,而_cap表示分配的缓冲区大小,通常比_size大一些,以避免频繁的内存重新分配。
注意:在真实项目中,size_t类型比int更适合表示大小和容量,这里使用int是为了简化示例代码。
1.2 构造函数与析构函数
构造函数需要处理多种初始化情况,包括空字符串、C风格字符串和拷贝构造:
cpp复制// 默认构造函数和C字符串构造函数
string(const char* a1 = "") {
_size = strlen(a1);
_cap = _size + 1;
_arr = new char[_cap];
strcpy(_arr, a1);
}
// 拷贝构造函数
string(const string& a1) {
_arr = new char[a1._cap];
strcpy(_arr, a1._arr);
_cap = a1._cap;
_size = a1._size;
}
// 析构函数
~string() {
delete[] _arr;
_cap = 0;
_size = 0;
}
拷贝构造函数的实现特别重要,它需要深拷贝源字符串的内容,而不是简单地复制指针。这是实现"Rule of Three"(三法则)
