我知道我可以像这样初始化
std::string foo [3] = {"T1","T2","T3"};
但是如果之前宣布它,我必须自己初始化每个? 示例
std::string foo [3];
foo[0] = "T1"
foo[1] = "T2"
foo[2] = "T3"
我的意思是一次性给所有值字符串foo = {“T1”,“T2”,“T3”}
答案 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";
带走了很多痛苦。