【问题标题】:On which occasions will c++ initialize variables with zero? [duplicate]c++ 在哪些情况下会将变量初始化为零? [复制]
【发布时间】:2013-12-05 14:48:05
【问题描述】:

每个变量在使用前都应该被正确定义和初始化(给它赋值)。但是在某些情况下,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 不,不要假设 POD 已初始化。
  • @andre 如果您“不确定”,请不要回答。

标签: c++ initialization


【解决方案1】:

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

以下情况会进行零初始化:

  1. 对于具有静态或线程本地存储持续时间的每个命名变量,在任何其他初始化之前。
  2. 作为value-initialization即带有一对空括号或大括号)序列的一部分,用于非类类型和没有构造函数的值初始化类类型的成员。
  3. 当使用太短的字符串字面量初始化字符数组时,数组的其余部分将被初始化为零。

【讨论】:

  • 最后一行是可疑的。字符数组的处理方式与所有其他数组相同。 int a[2] = { 2 }a[1] 初始化为零。
  • @MSalters 最后一行来自§8.5.2[dcl.init.string]/3 (C++11)
  • @MSalters item 3 特别提到用字符串字面量初始化,即"abc",而不是像{'a', 'b', 'c'} 这样的数组初始化器,所以它确实是一个特殊情况字符数组。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多