C++会在哪些情况下用零初始化变量?

3

在使用变量之前,每个变量都应该被正确地定义和初始化(分配一个值)。然而,在某些情况下,C++会将变量设置为默认值零。就像下面的例子一样。

class A{
    ...
    static int val;
    ...};

//int val = 10; //This is the usual definition.
int val;//Definition without assigning a value.
...
A a;  //a class A object
std::cout<<a.val;

结果将是零。显然,编译器对变量a.val进行了初始化为零的操作。我很好奇他们一般会在什么时候这样做?

我不确定,但对于POD类型,它会被初始化为0,但是说实话不要依赖于它,最好自己进行初始化。 - andre
1
@andre 不要假设POD已经初始化。 - Johan
@andre 如果你“不确定”,请不要回答。 - Casey
1个回答

8

http://en.cppreference.com/w/cpp/language/zero_initialization

以下情况会进行零初始化:
1. 对于所有具有静态或线程本地存储期的命名变量,在任何其他初始化之前。
2. 作为value-initialization的一部分(即对于非类类型和没有构造函数的值初始化类类型的成员,使用空括号或花括号序列)。
3. 当字符数组用太短的字符串字面值初始化时,其余部分将进行零初始化。

3
最后一行含糊不清。字符数组与其他数组的处理方式相同。int a[2] = { 2 } 会将 a[1] 初始化为零。 - MSalters
@MSalters 最后一行来自于§8.5.2[dcl.init.string]/3(C++11) - Cubbi
@MSalters的第三项特别提到用字符串字面值初始化,即"abc",而不是使用数组初始化器如{'a','b','c'},因此它确实是字符数组的一个特殊情况。 - Colin D Bennett

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