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

Array of strings initialization in c++

本文关键字:初始化 数组 字符串 c++      更新时间:2023-10-16

我知道我可以这样初始化

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

但是如果在它之前声明,我是否需要逐个初始化呢?示例

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

我的意思是一次给字符串所有的值foo ={"T1","T2","T3"}

从技术上讲,您不能在声明之后初始化它。其中的细微差别很重要,因为在第二个示例中,您将对单个字符串进行赋值。现在,你想给整个数组赋值,这行不通。如果你使用像std::vector这样更智能的数据结构,你确实可以在一条指令中分配所有的值,因为向量会扔掉旧的字符串,并创建新的字符串,这些字符串将从你的"T1"中复制构造,…字符串。

如果在它之前声明过,我是否需要逐个初始化呢?

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

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

为清晰而编辑:

中的"新"我不是指像new分配到堆,它被存储在你声明的任何地方,在数据部分(全局)或堆栈(局部)。


从评论来看,你似乎更多的是在想这样的事情:

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

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

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

在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";

可以省去很多痛苦