4

我已经看到以下列方式使用字符串数组的代码。

string *pointer = new string[runtimeAmmount];

我还看到了按如下方式访问的字符串中的各个字符。

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

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

注意:我最初的问题是不同的,但我想把它打出来。如果有人仍然可以回答我最初的问题只是为了验证,我将不胜感激。我最初的问题如下:如果每个字符串在其整个生命周期中的长度都可以变化,那么字符串数组如何是新的?字符串不会相互碰撞吗?

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

或者

字符串是 STL 模板中的一种,我还没有真正花时间去研究它。

4

3 回答 3

8

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

现在对于您的每一行:

string *pointer = new string[runtimeAmmount];

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

string aString = "this";

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

char bString[] = "that";

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

bString[3] = aString[3];

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

我希望这有帮助。

于 2012-07-03T01:50:57.870 回答
4

当你这样做时:

string *pointer = new string[runtimeAmmount];

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

于 2012-07-03T01:52:08.733 回答
3

你的直觉是正确的。

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

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

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

然后您将能够看到字符串如何工作。请注意, std::string 实际上比这复杂得多;但这应该可以理解。

至于模板,std::stringstd::basic_string, 专用于char(相对于std::wstring, 专用于wchar_t)的实例化

于 2012-07-03T01:50:40.367 回答