3

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

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

后来,在第 73 页,他们定义了一个新类,如下所示:

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

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

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

4

2 回答 2

2

引用似乎在错误的上下文中。一个变量至少可以有 3 种状态:

  1. 默认初始化:变量在构造函数内部根据参数或无参数进行初始化。初始化的值是这种类型的一个特例
  2. In-class initialized:您在代码中提供的 C++11 功能
  3. 未初始化:变量的初始化没有在任何地方处理,它可以包含任何垃圾值。一些编译器可能会自动生成0或发出警告
于 2012-11-17T13:37:51.123 回答
1

关于“在任何函数体之外定义的变量”的第一个陈述是指具有静态链接的对象,即在命名空间中声明的变量:这些是零初始化的。无论它在哪里,get中的成员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并明确初始化它们以确保设置值。

于 2012-11-17T13:36:54.107 回答