C++中字符串数组的初始化

3
我知道我可以像这样初始化
std::string foo [3] = {"T1","T2","T3"};

但是如果我之前已经声明了它,我需要单独初始化每一个吗? 例如:
std::string foo [3];
foo[0] = "T1"
foo[1] = "T2"
foo[2] = "T3"

我的意思是将字符串一次性赋值 foo ={"T1","T2","T3"}

5个回答

1

不像Java一样,当你声明数组时,它会在每个索引处使用默认构造函数创建一个字符串。

为了更清晰明确,编辑如下:

通过“new”,我并不是指像new分配到堆中,它会被存储在你声明的位置,数据段(全局变量)或栈(局部变量)。


从评论中看来,你更倾向于这样的东西:

std::string foo[3];
...
foo = {"a","b","c"}; // DOES NOT WORK

不行,你不能这样做。`foo`已经分配并初始化了它的空间,你不能像那样直接赋值整个数组(除非在初始化器中)。如果你将其声明为`std::string *foo`,你可以这样做,但在这种情况下我不建议这样做。

1
如果我之前声明了它,那么我是否需要逐个初始化每一个变量?
你不需要逐个初始化每一个变量。它们会被初始化为空字符串(默认构造),然后你再给它们赋值。

是的,我知道它们被初始化为空字符串,但我想一次性将它们全部初始化。 - andrewmag
@andrewmag:你现在说了两件不同的事情。现在似乎你想在一个地方将它们初始化为空字符串,然后在另一个地方将它们初始化为非空字符串。你是想初始化两次吗?还是想随后更改它们的值? - David Schwartz
不,我不想初始化它们两次,我只想声明它们,然后一次性地赋值,例如foo = {"T1","T2","T3"}。 - andrewmag

1

从技术上讲,在声明后您无法初始化它。细微差别很重要,因为在您的第二个示例中,您将值分配给了单个字符串。现在,您想要将值分配给整个数组,但这是行不通的。如果您使用更智能的数据结构,如std::vector,则可以在一条指令中分配所有值,因为向量会丢弃旧字符串并创建新字符串,这些字符串将从您的"T1",..字符串复制构造。


谢谢,这正是我想知道的。 - andrewmag

0
在C++0x中,您将能够使用通用的初始化列表。 但这与手写赋值不会有太大区别。
请注意,然而,在每个分配中重复使用一个复杂表达式的情况下(正如K-ballo指出的,分配和初始化之间的区别有时很重要,请养成区分的习惯):
ALongPointerName->ALongMemberName.ALongArrayName[0] = "T1";
ALongPointerName->ALongMemberName.ALongArrayName[1] = "T2";
ALongPointerName->ALongMemberName.ALongArrayName[2] = "T3";

你可以使用引用来简化它:
auto& a = ALongPointerName->ALongMemberName.ALongArrayName;
a[0] = "T1";
a[1] = "T2";
a[2] = "T3";

这大大减轻了很多痛苦。


0

我仍在学习C++,经验不是很丰富,但我认为这可能是最好的方法,如果您想在声明后初始化。或者您可以使用for循环来填充它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接