我见过以下列方式使用字符串数组的代码。
string *pointer = new string[runtimeAmmount];
我还看到了字符串中的各个字符,如下所示。
string aString = "this";
char bString[] = "that";
bString[3] = aString[3];
以上将导致bString等于“thas”。这表明字符串实际上是指向第一个字符位置的指针。但是,字符串仍然具有作为“string.c_str()”访问的成员函数,这意味着它本身作为对象不遵循指针的规则。这一切都有用吗?
注意:我原来的问题是不同的,但我想出来输入它。如果有人仍然可以回答我原来的问题只是为了验证我会很感激。我原来的问题如下: 如果每个字符串在其整个生命周期中的长度可以变化,那么如何将字符串数组换成新的?弦不会相互碰撞吗?
我想出的答案是: 字符串以某种方式包含指向C样式数组的指针,因此对象占用了一定量的空间。
OR
字符串属于STL模板类型,我还没有花时间去查看。
答案 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::string
是std::basic_string
的实例化,专门用于char
(与std::wstring
相对,专门用于wchar_t
)
答案 2 :(得分:3)
执行此操作时:
string *pointer = new string[runtimeAmmount];
您正在创建一个string
个对象的数组。每个都使用string::string
构造函数构造,它可以执行任何需要执行的操作。在这种情况下,string
有一个指向内存的指针,该指针在构造函数中初始化。所以你的数组就像一个char *指针数组,每个指针都是单独的malloced。