提示信息

C++初阶学习第七篇——字符串模拟实现

101℃太阳 已关注

在C++中,字符串处理是一个非常重要的主题。在标准库中,我们通常使用std::string来处理字符串,但为了深入理解其背后的工作原理,自行实现一个简单的字符串类是一个很好的练习。下面,我们将逐步构建一个简单的字符串类。

1. 类的定义

首先,我们需要定义一个类来表示字符串。通常,我们会在类中包含私有成员来存储字符串的字符和字符串的长度。

  1. class MyString {
  2. private:
  3. char* data; // 动态分配的字符数组
  4. size_t length; // 字符串长度
  5. public:
  6. // 构造函数
  7. MyString(const char* str = "") {
  8. length = strlen(str);
  9. data = new char[length + 1]; // +1是为了存储结尾的'\0'
  10. strcpy(data, str);
  11. }
  12. // 拷贝构造函数
  13. MyString(const MyString& other) {
  14. length = other.length;
  15. data = new char[length + 1];
  16. strcpy(data, other.data);
  17. }
  18. // 析构函数
  19. ~MyString() {
  20. delete[] data;
  21. }
  22. // 重载赋值运算符
  23. MyString& operator=(const MyString& other) {
  24. if (this != &other) {
  25. delete[] data;
  26. length = other.length;
  27. data = new char[length + 1];
  28. strcpy(data, other.data);
  29. }
  30. return *this;
  31. }
  32. // 获取字符串长度
  33. size_t size() const {
  34. return length;
  35. }
  36. // 获取字符数组
  37. const char* c_str() const {
  38. return data;
  39. }
  40. };

2. 构造函数

MyString类包含多个构造函数:
- 默认/参数化构造函数:可以接受一个const char*来初始化字符串。
- 拷贝构造函数:用于初始化一个新对象为另一个对象的副本。
- 析构函数:释放之前动态分配的内存。

3. 赋值运算符重载

重载赋值运算符是为了支持对象之间的赋值操作。需要小心处理自赋值(即一个对象赋值给自己)的情况。

4. 获取字符串信息

提供了一些基本的功能,例如获取字符串的长度和底层字符数组(即以'\0'结尾的C风格字符串)。

5. 使用示例

  1. int main() {
  2. MyString str1("Hello");
  3. MyString str2 = str1; // 使用拷贝构造函数
  4. MyString str3;
  5. str3 = str1; // 使用赋值运算符重载
  6. std::cout << "str1: " << str1.c_str() << ", Length: " << str1.size() << std::endl;
  7. std::cout << "str2: " << str2.c_str() << ", Length: " << str2.size() << std::endl;
  8. std::cout << "str3: " << str3.c_str() << ", Length: " << str3.size() << std::endl;
  9. return 0;
  10. }

以上代码展示了一个简单的字符串类实现,可以帮助你理解C++中的对象管理和动态内存管理。通过这种练习,能更好地理解标准库中的std::string如何高效地工作。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
101℃太阳 关注 已关注

最近一次登录:2024-11-19 21:53:36   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图