具有自动存储期的局部变量不会自动初始化。由于使用未初始化的变量会产生undefined behavior,因此在即使多余的情况下也要显式初始化您的变量是一个好习惯。
关于被零初始化的POD类型,C++03标准3.6.2 Initialization of non-local objects说明:
对象具有静态存储期(3.7.1)的对象在进行任何其他初始化之前必须进行零初始化(8.5)。零初始化和用常量表达式初始化统称为静态初始化;所有其他初始化都是动态初始化。使用常量表达式初始化的POD类型(3.9)的具有静态存储期的对象必须在进行任何动态初始化之前进行初始化。
因此,标准保证了具有静态存储期的POD类型(无论其作用域如何)将被零初始化。
此情况在12.6.2 Initializing bases and members中进行了描述,该部分说明(选定部分):
如果一个非静态数据成员或基类没有被 mem-initializer-id 命名(包括构造函数没有 ctor-initializer 的情况),则:
- 如果该实体是非静态数据成员,并且实体类是非 POD 类,则该实体将进行默认初始化(8.5)...
- 否则,该实体未初始化...
在类 X 的构造函数调用完成后,如果 X 的成员既没有在构造函数的 mem-initializers 中指定,也没有进行默认初始化、值初始化或在构造函数体执行期间给出值,则该成员的值是不确定的。
示例:
class C
{
public:
C(int x, int z) : x(x), z(z) { }
int x, y, z;
};
int main(void)
{
C* c = new C(1,3);
std::cout << c->y;
}
static
存储类别说明符和静态存储期,前者对初始化没有影响,后者有。 - Jonathan Wakely