c++中字符串数组的初始化
Array of strings initialization in c++
我知道我可以这样初始化
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";
可以省去很多痛苦
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组