我见过以下列方式使用字符串数组的代码。
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
objects 数组。 runtimeAmmount
是数组中的字符串数,而不是 C 风格字符串中的字符数。
string aString = "this";
此行使用来自 string
类的(非显式)转换构造函数构造一个新的空字符串:string(const char *)
。 (请注意,在非构造上下文中,例如 aString = "this";
,operator=(const char *)
重载 string
类将被使用。)
char bString[] = "that";
这是一个被视为字符数组的典型 C 字符串。
bString[3] = aString[3];
这里使用string
类的重载operator[]
返回一个字符(reference),然后赋给C风格字符中的第3个字符点数组。
希望对您有所帮助。
关于c++ - 为什么 new 能够创建一个字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11303440/