c++ - c++中字符串类型是如何创建的?

标签 c++ c arrays string character

“字符串”类型是如何在 C++ 中创建的?在C中,字符串是字符数组,但C++是如何将字符数组变成我们在C++中所知道的“字符串”的呢?

最佳答案

字符数组仍然在那里,只是包裹了一个类。想象一下这样的事情:

class String
{
private:
  char* stringData;

public:
  String(const char* str)
  {
    stringData = new char[strlen(str)+1];
    strcpy(stringData, str);
  }

  ~String() { delete[] stringData; }

  String& operator += (const String& rhs)
  {
    char* newStringData = new char[strlen(rhs) + strlen(stringData) + 1];
    strcpy(newStringData, stringData);
    strcpy(newStringData + strlen(stringData), rhs);
    delete[] stringData;
    stringData = newStringData;
    return *this;
  }
};

这显然是一个非常不完整的示例,但您明白了,对吧?

std::string 的实际实现非常全面,但您自己可以做到。以下是官方 std::string 类与我发布的内容的一些差异:

  • 字符串的长度通常作为成员变量包含在内,因此您不必一直调用 strlen 来查找长度。
  • std::string 类使用模板,因此您不限于 char 类型。如果您使用的是 Unicode,则可以使用 std::wstring,它通过将 char 类型替换为 wchar_t 类型来使用 16 位或 32 位字符串。
  • 通常有很多优化可供选择。最近最流行的是“短字符串”优化。

一旦您相对熟悉了 C++,就应该尝试编写自己的字符串类。这不是你会在实践中使用的东西,但它是图书馆写作的一个很好的练习。

关于c++ - c++中字符串类型是如何创建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6825375/

相关文章:

c - 制定隐式规则和头文件

java - 如果 array 或 arrayList 引用前一个元素,我如何实现一个返回 true 的函数?

c++ - 为什么 std::array< T, 0 > 不为空?

c++ - c++11 中 std::move 操作的行为

c++ - 如何为文本设置计时器?

c - C 中使用回车符终止程序

c++ - C和C++中的内存管理有什么区别

代码不起作用。但是调试的时候会出现这样的情况

c - 为什么不能将作为输入参数传递给函数的二维数组在其函数声明中声明为 int**?

c - 打印数组中断错误