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

时间:2011-11-05 17:12:02

标签: c++ arrays string

我知道我可以像这样初始化

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 个答案:

答案 0 :(得分:1)

  

如果之前已经声明了,我必须自己初始化它们吗?

您没有自己初始化每一个。它们被初始化为空字符串(默认构造),然后您为它们分配值。

答案 1 :(得分:1)

不,(与Java不同),当您声明数组时,它会使用默认构造函数在每个索引处创建一个字符串。

为清晰起见编辑:

by“new”我的意思不像堆new的分配,它存储在你声明它的地方,数据部分(对于全局)或堆栈(本地)。


从评论中,您似乎更多地考虑这样的事情:

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我还在学习C ++并且我不是很有经验,但我相信如果你想在声明之后进行初始化,这可能是最好的方法。或者您可以使用for循环来填充它。

答案 4 :(得分: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";

带走了很多痛苦。