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

时间:2012-07-03 01:42:28

标签: 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样式数组的指针,因此对象占用了一定量的空间。

OR

字符串属于STL模板类型,我还没有花时间去查看。

3 个答案:

答案 0 :(得分:8)

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

现在为您的每一行:

string *pointer = new string[runtimeAmmount];

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

string aString = "this";

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

char bString[] = "that";

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

bString[3] = aString[3];

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

我希望这会有所帮助。

答案 1 :(得分: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

答案 2 :(得分:3)

执行此操作时:

string *pointer = new string[runtimeAmmount];

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