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

use*_*468 4 c++ arrays string pointers stl

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

string *pointer = new string[runtimeAmmount];
Run Code Online (Sandbox Code Playgroud)

我还看到了字符串中的各个字符访问如下.

string aString = "this";
char bString[] = "that";
bString[3] = aString[3];
Run Code Online (Sandbox Code Playgroud)

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

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

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

要么

字符串是STL模板的一种,我还没有花时间去看.

Tur*_*rix 8

我将在你的问题中解决4行代码中的每一行中发生的事情,但首先我应该说你的结论并不准确.您被string课程内置的操作员重载"愚弄"了.虽然很可能是在内部,但是string类维护了一个C风格的字符数组,这个数组是封装的,string并且应该被视为一个不透明的对象,不同于C风格的字符串.

现在为您的每一行:

string *pointer = new string[runtimeAmmount];
Run Code Online (Sandbox Code Playgroud)

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

string aString = "this";
Run Code Online (Sandbox Code Playgroud)

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

char bString[] = "that";
Run Code Online (Sandbox Code Playgroud)

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

bString[3] = aString[3];
Run Code Online (Sandbox Code Playgroud)

这使用了过载operator[]的的string类返回一个字符(基准),然后将其分配给C风格字符阵列中的第三个字符的位置.

我希望这有帮助.