C++数组初始化

97

这种方式初始化数组为全0的形式:

char myarray[ARRAY_SIZE] = {0}所有编译器都支持吗?

如果是,是否有类似其他类型的语法?例如:

bool myBoolArray[ARRAY_SIZE] = {false} 

我敢打赌,false0 是一样的(否则 if(false) 就不会被评估为 false),所以你所拥有的可能在 99% 的编译器上都能工作。在引用标准之前,无法确定另外的 1%。 - Chris Lutz
我知道在C语言中,int a[10] = { 1, 2, 3 };会将a[3]..a[9]设置为0,(“隐式初始化与具有静态存储期的对象相同”)。这对于C++也适用吗? - Alok Singhal
5
是的,它确实如此。如果C++不能做到这一点,那么它就不可能与C保持任何程度的向后兼容。 - Chris Lutz
2
false不等于0,但在{0}中,0会被转换为false,而在(对于C++来说){}中,你甚至不需要关心转换:它被初始化为false0或空指针或任何其他与类型有关的默认值。 - Johannes Schaub - litb
5个回答

157

是的,所有C++编译器都支持这种初始化方式。这是C++语言的一部分。实际上,这是从C语言中引入到C++中的惯用法。在C语言中,= { 0 } 是一种惯用的通用零初始化器。在C++中也几乎如此。

由于这个初始化器是通用的,对于布尔数组,您实际上不需要不同的“语法”。0 也可以作为bool类型的初始化器。

bool myBoolArray[ARRAY_SIZE] = { 0 };

这个方法保证用false来初始化整个数组。此外,

char* myPtrArray[ARRAY_SIZE] = { 0 };

使用char *类型的null指针保证了整个数组被初始化为null。

如果您认为这样可以提高可读性,当然可以使用。

bool myBoolArray[ARRAY_SIZE] = { false };
char* myPtrArray[ARRAY_SIZE] = { nullptr };

但关键是= { 0 }变量会给您完全相同的结果。

然而,在C++中,= { 0 }可能对于所有类型都不起作用,例如枚举类型,它们不能用整数0进行初始化。但是C++支持更短的形式。

T myArray[ARRAY_SIZE] = {};

即只有一对空的 {}。这将默认初始化任何类型的数组(假设元素允许默认初始化),这意味着对于基本(标量)类型,整个数组将被正确的零初始化。


8
在C++0x中,您将能够像这样初始化任何内容。 - jk.
5
在我的编译器(qt creator 2.4.1 - qt 版本 4.8.0)中,如果我写 bool myBoolArray[ARRAY_SIZE] = { false };,数组中的所有元素都会初始化为 false。但如果我写 bool myBoolArray[ARRAY_SIZE] = { true };,只有第一个元素会被设置为 true,其他一切都是 false。有什么解释吗? - rookie coder
@初学者程序员:你想要解释什么?你期望会发生什么?在C ++中,如果你部分初始化一个bool数组,剩下的将自动进行零初始化。这就是现实。 - AnT stands with Russia
3
@AndreyT 好的,但我认为这种行为至少是违反直觉的。如果我不初始化,比如 bool myBoolArray[ARRAY_SIZE];,那么数组中就会包含随机值,因此我不会期望初始化会返回一个带有不同值的数组。就这样。 - rookie coder
3
@AndreyT: 当然,但我从未想过雪崩会与第一个元素不同;-) 无论如何,感谢您提供的信息! - rookie coder
显示剩余6条评论

21

请注意,在C++11通用初始化语法中,'='是可选的,通常更好的做法是写成:

char myarray[ARRAY_SIZE] {0}

如何理解 char myarray[ARRAY_SIZE] {0}?将 myarray 的每个元素初始化 ARRAY_SIZE 次? - John
@John 将第一个元素初始化为 0,其他元素默认初始化为零。 - undefined

1
此外,如果没有显式初始化,请注意如何默认初始化arrayvector
int main()
{
    bool arr1[3];                   // true  true  true  [here true is SOME garbage value] 
    std::vector<bool> vec1(3);      // false false false

    bool arr2[3] = { true };        // true false false [here true/false are REAL true/false values] 
    vector<bool> vec2(3, true);     // true true  true

    bool arr3[3] = { false };         // false false false
    std::vector<bool> vec3(3, false); // false false false


    int arr4[3];                      // GV GV GV - garbage value
    std::vector<int> vec4(3);         // 0 0 0

    int arr5[3] = { 1 };              // 1 0 0
    std::vector<int> vec5(3, 1);      // 1 1 1

    int arr6[3] = { 0 };              // 0 0 0
    std::vector<int> vec6(3, 0);      // 0 0 0
}

如果你不是真的意思是“真”或“假”,请不要写“true”或“false”。这样会让人感到困惑和误导。请写“x”或“y”或“<未指定>”。 - undefined

1

是的,我相信它应该可以工作,并且也可以应用于其他数据类型。

对于类数组而言,如果初始化列表中的项比数组中的元素少,则默认构造函数将用于剩余的元素。如果未为类定义默认构造函数,则初始化列表必须完整 - 也就是说,数组中的每个元素都必须有一个初始化器。


0
你可以用以下方式在C++中声明数组。 如果你知道数组的大小,那么你应该这样声明数组: 整数: int myArray[array_size]; 双精度浮点数: double myArray[array_size]; 字符和字符串: char myStringArray[array_size]; 字符和字符串之间的区别如下所示。
char myCharArray[6]={'a','b','c','d','e','f'};
char myStringArray[6]="abcdef";

如果你不知道数组的大小,则应该像以下一样留空数组。

整数: int myArray[array_size];

双精度浮点数: double myArray[array_size];


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接