为什么 new 能够创建字符串数组

Why is new able to create an array of strings?

本文关键字:字符串 数组 创建 new 为什么      更新时间:2023-10-16

我见过以下列方式使用字符串数组的代码。

string *pointer = new string[runtimeAmmount];

我还看到了字符串中的各个字符,如下所示。

string aString = "this";
char bString[] = "that";
bString[3] = aString[3];

以上将导致 bString 等于 "thas"。这表明字符串实际上是指向第一个字符位置的指针。但是,字符串仍然具有以"string.c_str()"访问的成员函数,这意味着它本身作为一个对象不遵循指针的规则。这一切是如何运作的?

注意:我最初的问题是不同的,但我想通了。如果有人仍然可以回答我最初的问题只是为了验证,我将不胜感激。我最初的问题如下:如果每个字符串在其整个生命周期中长度可以变化,那么字符串数组如何成为新的?琴弦不会碰到对方吗?

我想出的答案是:字符串以某种方式包含指向 C 样式数组的指针,因此对象占用一定的空间量。

字符串是 STL 模板种类的一部分,我还没有真正花时间去看。

我将解决您问题中 4 行代码中每行代码中发生的事情,但首先我应该说您的结论不准确。 您被内置在 string 类中的运算符重载"愚弄"。 虽然在内部string类可能维护一个 C 样式的字符数组,但它是封装的,并且string被视为并且应该被视为不透明对象,不同于 C 样式字符串。

现在对于您的每条线:

string *pointer = new string[runtimeAmmount];

在此行中,pointer设置为指向新分配的(空)string对象数组。 runtimeAmmount是数组中的字符串数,而不是 C 样式字符串中的字符数。

string aString = "this";

此行使用 string 类中的(非显式)转换构造函数构造一个新的空字符串:string(const char *) 。 (请注意,在非构造上下文(如 aString = "this"; )中,将使用 string 类的operator=(const char *)重载。

char bString[] = "that";

这是一个典型的 C 字符串,被视为字符数组。

bString[3] = aString[3];

这使用 string 类的重载operator[]返回字符(引用),然后将其分配给 C 样式字符数组中的第 3 个字符位置。

我希望这有所帮助。

当你这样做时:

string *pointer = new string[runtimeAmmount];

您正在创建 string 对象的数组。 每个都是使用 string::string 构造函数构造的,它可以做任何需要做的事情。 在这种情况下,string有一个指向内存的指针,该内存在构造函数中初始化。 因此,您的数组就像一个 char* 指针数组,每个指针都单独分配不当。

你的直觉是正确的。

C++中的字符串是一个对象,可以包含指向其他存储的指针。(他们不需要;谷歌"小字符串优化"如果你想看看为什么不 - 但这是一个转移。

如果您将字符串视为如下所示的结构:

struct str {
   int len; // number of bytes allocated
   char *data; // pointer to the data
};

然后,您将能够看到字符串如何工作。请注意,std::string 实际上比这复杂得多;但这应该能把这个想法传达出去。

至于模板,std::stringstd::basic_string的实例化,专门用于char(而不是专门用于wchar_tstd::wstring