1. 项目概述
作为一名C++开发者,string类的使用可以说是家常便饭。但你是否想过,这个看似简单的字符串容器背后隐藏着怎样的实现机制?今天,我将带你从零开始,手把手实现一个简化版的string类,深入理解其底层原理。这不仅有助于你更好地使用STL,更能提升你对C++内存管理和类设计的理解。
在标准库中,string是一个功能强大的字符串类,它封装了字符数组的操作,提供了丰富的接口。但为了教学目的,我们将实现一个简化版本,包含最核心的功能:构造/析构、拷贝控制、迭代器和基本容量操作。通过这个实践,你将掌握:
- 动态内存管理的核心技巧
- 深浅拷贝的实际应用场景
- 迭代器设计的底层逻辑
- 字符串操作的基本原理
2. 核心实现解析
2.1 构造函数实现
2.1.1 默认构造函数
cpp复制string::string()
:_str(new char[1]{'\0'})
,_size(0)
,_capacity(0)
{}
这个默认构造创建了一个空字符串。关键点在于:
- 即使为空字符串,我们也需要分配一个字节的空间来存放结束符'\0'
- 初始_size和_capacity都设为0,因为实际有效字符数为0
- 使用初始化列表确保成员变量被正确初始化
注意:这里使用了C++11的统一初始化语法{'\0'},这比传统的赋值方式更高效,因为它避免了额外的赋值操作。
2.1.2 带参构造函数
cpp复制string::string(const char* str)
:_size(strlen(str))
{
_capacity = _size;
_str = new char[_size+1];
memcpy(_str, str, _size+1);
}
这个构造接收一个C风格字符串,需要注意:
- 使用strlen获取输入字符串长度,但只在初始化列表中使用一次
- 在函数体内设置_capacity,避免多次调用strlen
- 分配空间时要+1,为'\0'预留位置
- 使用memcpy进行内存拷贝,比逐字符复制更高效
关键技巧:strlen是一个O(n)操作,应尽量避免重复调用。这也是为什么我们在初
