C++局部变量,在默认初始化内置类型时,值是未定义的。但是对于类类型,却会自动调用默认构造函数来进行默认初始化。
对于这点,其实来自于C/C++的一贯坚持的哲学:不做产生额外开销的事。具体到这个问题,是这样的:对于POD类型(就是你所说的“内置类型”,全称是:Plain Old Data),因为它的数据结构和操作模型都已经在C的标准文本中仔细定义了,而C++为了最大程度的兼容C代码,这部分自然也要照抄。所以,C++完全没有必要额外的增加“初始化为0”的开销。一方面是为了兼容C,另一方面是没有付出这些额外开销的必要性。对于非POD类型,初始化的额外开销是不可避免的:因为(为了性能),它的内存布局并没有在标准中定义,甚至连vtable之类,也是实现相关的内容。所以,对于非POD类型如何布局、如何初始化、何种状态表明其“可用”……标准是把它交给编译器和代码编写者的。而既然把决策权和实现权交了出去,那为了代码跨平台/跨编译器的移植性和兼容性考虑,自然就需要约定操作模型——这就是为什么非POD类型要有一系列的特殊成员函数:包括构造函数、析构函数,另外还有拷贝构造和=操作符。另外,在C++中,对于POD或者非POD类型,其实并没有区别对待:当不提供明确初始化代码时,都没有默认的“初始化为0”的操作(static除外)。