2011-11-05 59 views
2

我知道我可以初始化这样字符串数组的初始化C++中

std::string foo [3] = {"T1","T2","T3"}; 

但如果宣称它做之前,我必须初始化每一个通过自己的? 例如

std::string foo [3]; 
foo[0] = "T1" 
foo[1] = "T2" 
foo[2] = "T3" 

我的意思是给串一次富=所有的值{“T1”,“T2”,“T3”}

回答

1

技术上讲,你不能在声明之后其初始化。细微之处非常重要,因为在第二个例子中,您分配给单个字符串。现在,你想分配给整个数组,这是行不通的。如果你使用了更加智能的数据结构,如std::vector,你确实可以在一条指令中分配所有的值,因为这个向量会丢弃旧字符串并创建新的字符串,这些字符串将从您的"T1",..字符串中复制而来。

+0

谢谢,这正是我想知道的 – andrewmag

1

什么,如果宣布它做之前,我必须初始化每一个都由它自己?

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

+0

是的,我知道它们被初始化成为空字符串,但我想在一次 – andrewmag

+0

@andrewmag初始化它们都:现在你是说两个不同的东西。现在好像你想初始化它们在一个地方清空字符串,然后将它们初始化为其他地方的非空字符串。你想两次初始化它们吗?或者你想稍后改变他们的价值观? –

+0

没有我不想初始化它们两次我只是想声明它们,然后将它们分配一旦例如FOO值= {“T1”,“T2”,“T3”} – andrewmag

0

我还在学习C++,我不是很有经验,但我相信,也许是,如果你想申报后,初始化的最佳途径。或者你可以使用for循环来填充它。

1

没有,(不像Java的),当你声明数组,它将使用默认的构造函数的每个索引处的字符串。

编辑为清楚:

由“新”我的意思不是像new分配堆,它被存储无论你宣布它在数据部分(对于全局)或栈(当地人) 。


从评论,似乎你想更多的是这样的:

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

不,你不能这样做。 foo已经有了它的空间分配和初始化,你不能只分配整个阵列一样,(除了在初始化)。如果你宣布它可以是std::string *foo,但我不建议在这种情况下。

+0

耶,这是我想的,非常感谢 – 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"; 

其带走太多的痛苦。