1. string类常见接口及其模拟实现
在C++编程中,string类是最常用的标准库组件之一。作为初学者,理解其内部实现原理对于掌握C++面向对象编程和内存管理至关重要。本文将深入探讨string类的几种常见遍历方式及其底层实现。
1.1 下标访问与operator[]重载
最直观的字符串遍历方式是通过下标访问,这需要我们对operator[]进行重载。让我们先看实现代码:
cpp复制char& operator[](size_t pos)
{
assert(pos < strlen(_str));
return _str[pos];
}
const char& operator[](size_t pos) const
{
assert(pos < strlen(_str));
return _str[pos];
}
这里实现了两个版本的重载:
- 普通版本返回char的引用,允许修改字符串内容
- const版本返回const char的引用,用于const对象
关键点在于assert断言检查,它确保访问位置不会越界。在实际项目中,我们也可以考虑使用异常处理替代断言。
使用示例:
cpp复制string s1("hello world");
for (int i = 0; i < s1.size(); ++i)
{
cout << s1[i];
}
注意事项:
- 下标运算符通常不检查负索引,因为pos参数是size_t类型
- 在调试版本中assert会生效,但发布版本中可能被优化掉
- 对于空字符串,strlen(_str)将返回0,任何pos都会触发断言
1.2 c_str()接口实现
c_str()是string类与C风格字符串的桥梁,它返回一个以'\0'结尾的字符数组:
cpp复制const char* c_str() const
{
return _str;
}
这个实现看似简单,但有几个关键点需要注意:
- 返回类型是const char*,防止外部修改字符串内容
- 要求内部存储_str必须以'\0'结尾
- 返回的指针在string对象修改后可能失效
使用示例:
`
