2012-11-17 279 views
3

在我的C++入门,第5版,他们43页约默认初始化(重点煤矿)上说:默认初始化混乱

的对象的价值内置类型是不明确的初始化取决于它在哪里被定义。 在任何函数体外定义的变量都被初始化为零。

后来,73页,他们定义一个新类这样的:

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

据说这是为了提供新的标准在类初始化的一个例子。在这种情况下,units_soldrevenue将被初始化为零。如果他们不是,他们说,变量将被默认初始化。

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

+1

数据成员不会**被初始化为0,因此引用是错误的,或者有一些缺失的上下文。 – juanchopanza

回答

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的用户合作,并初始化它们明确地确保值被设置。

2

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

  1. 缺省初始化:变量是基于参数或没有参数的构造 内部初始化。 值初始化是这种类型的
  2. 在一流的初始化的一个特例:在C++ 11功能,您在 代码
  3. 未初始化已经提出:变量的初始化不被任何解决 和它可以包含任何垃圾值。某些编译器可能自动生成0或给出警告