1. 从StringBad到String:一个C++字符串类的进化之路
在C++开发中,字符串处理是最基础也最常遇到的任务之一。很多初学者在掌握了基本语法后,第一个尝试实现的类往往就是字符串类。今天我要分享的是一个从简陋的StringBad类逐步完善为功能完备的String类的完整过程,这个案例几乎涵盖了C++类设计的核心知识点。
这个String类最初版本存在严重的内存管理问题,经过多次迭代后,它现在具备了:
- 安全的动态内存管理
- 完整的拷贝控制(拷贝构造、赋值运算符)
- 丰富的字符串操作功能
- 运算符重载
- 静态成员管理
让我们从最关键的改进点开始,逐步剖析这个类的设计思路和实现细节。
2. 核心改进:内存管理与拷贝控制
2.1 默认构造函数的优化
原始版本的默认构造函数存在两个问题:一是会产生不必要的调试输出,二是初始化内容不必要地复杂。改进后的版本简洁而安全:
cpp复制String::String()
{
len = 0;
str = new char[1];
str[0] = '\0'; // 空字符串
}
这里有几个值得注意的技术细节:
- 即使创建空字符串,我们也分配了1字节的内存而不是直接赋nullptr,这是为了与析构函数中的
delete[]操作保持兼容 - 使用
len明确记录字符串长度,避免反复调用strlen - 确保字符串以'\0'结尾,符合C风格字符串规范
关键经验:在C++中,构造函数和析构函数的内存管理操作必须严格匹配。new/delete、new[]/delete[]必须成对使用。
2.2 拷贝构造函数与赋值运算符
原始类最大的问题就是缺少正确的拷贝控制,导致浅拷贝问题。改进版本实现了深拷贝:
cpp复制// 拷贝构造函数
String::String(const String& st)
{
num_strings++;
len = st.len;
str = new char[len + 1];
std::strcpy(str, st.str);
}
// 赋值运算符
String& String::operator=(const String& st)
{
if (
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容