1. 从C风格字符串到string类的进化之路
第一次接触C++字符串处理时,我习惯性地写下了char str[20] = "Hello"这样的代码。直到某天调试程序到凌晨三点,因为数组越界导致的内存错误让我痛定思痛——这就是C风格字符串的典型陷阱。C++的string类正是为了解决这些问题而诞生的。
传统C风格字符串本质是字符数组,以'\0'作为结束标志。这种设计存在三个致命缺陷:
- 固定大小导致缓冲区溢出风险(比如
strcpy到不足容量的数组) - 需要手动管理内存(何时分配、何时释放)
- 操作函数繁杂且不安全(
strcat、strcmp等)
而string类的核心优势在于:
- 自动内存管理(RAII机制)
- 动态调整容量
- 丰富的成员方法
- 与STL无缝集成
cpp复制// C风格字符串的典型问题
char buf[5];
strcpy(buf, "HelloWorld"); // 缓冲区溢出!
// string类的安全写法
std::string str;
str = "HelloWorld"; // 自动扩展内存
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. string类的核心特性解析
2.1 构造函数与内存管理
string类提供7种构造函数重载,最常用的有:
cpp复制std::string s1; // 空字符串
std::string s2("Hello"); // 从C字符串构造
std::string s3(5, 'A'); // 填充构造 "AAAAA"
std::string s4(s2); // 拷贝构造
其内存管理采用"短字符串优化(SSO)"策略:
- 短字符串(通常≤15字符)直接存储在对象内部
- 长字符串使用堆内存动态分配
- 容量(capacity)通常按指数增长(vs2019中初始容量为15)
经验:需要预分配大内存时,应使用
reserve()避免多次扩容:cpp复制std::string bigStr; bigStr.reserve(1000); // 预分配1KB
2.2 元素访问的边界安全
相比C风格的[]操作符,string类
