c++ - 为什么 new 能够创建一个字符串数组?

标签 c++ arrays string pointers stl

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

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/

相关文章:

c++ - C++中goto语句对栈的影响

javascript - 获取稀疏 JavaScript 数组的第一个元素

python - 替换非数字字符

Java,文本中的n个单词数

c++ - 简单矩阵类,错误: calling private constructor

c++ - VS C++ 程序仅在从文件夹运行 .exe 时才有效? [不是VS调试]

使用数组和 arrayList 的 Java 类

python - 将整数列表转换为字符串列表

c++ - 在函数中找到 minExam

javascript - 数组映射到带有换行符的字符串 - React