默认初始化混淆

时间:2012-11-17 13:18:00

标签: c++

在我的C ++ Primer第5版中,他们在第43页上说明了默认初始化(强调我的):

  

未显式初始化的内置类型对象的值取决于它的定义位置。 在任何函数体外定义的变量初始化为零。

稍后,在第73页,他们定义了一个这样的新类:

struct Sales_data {
  std::string bookNo;
  unsigned units_sold = 0;
  double revenue = 0.0;
};

这应该提供新标准的类内初始化器的示例。在这种情况下,units_soldrevenue将初始化为零。如果不是,他们说,变量将被默认初始化。

但这是我的问题:这个类内初始化有什么意义?让它们进行默认初始化有什么问题?我问的原因是他们已经提到在任何函数体外定义的变量初始化为零,在这种情况下,这些变量不在任何函数内 - 它们在类定义中。所以默认初始化应该将这些变量初始化为零,不应该吗?

2 个答案:

答案 0 :(得分:2)

引用似乎是在错误的背景下。变量至少可以有3种状态:

  1. 默认初始化:变量在构造函数内初始化 基于论证或不论证。 值已初始化是此类
  2. 的特例
  3. 课堂初始化:您提供的C ++ 11功能 你的代码
  4. 未初始化:变量的初始化未在任何地方解决 它可以包含任何垃圾值。某些编译器可能会自动使其0或发出警告

答案 1 :(得分:1)

关于“在任何函数体外定义的变量”的第一个语句是指具有静态链接的对象,即在命名空间中声明的变量:这些是零初始化。 struct中的成员会在struct生活的任何地方进行初始化。如果它存在于堆栈上或在堆上分配,则内置变量将不会在没有赋值的情况下进行初始化,例如,在使用时如下:

void f() {
    Sales_data data;
}

即使没有声明中的初始化,如果struct被这样使用,它们也会被初始化为零:

Sales_data global; // <--- the "outside any function body" case
void f() {
    Sales_data data0 = {};
    Sales_data data1 = Sales_data();
    Sales_data data2{};
}

但是,这些都需要struct的用户进行合作,并明确初始化它们以确保设置值。