能自动初始化的只是静态存储区的成员(全局成员,static声明成员都放在静态存储区),new出来的空间是操作系统自动分配的堆空间,所以不会自动初始化0。
摘录自ISO/IEC 14882:2011 8.5 6
To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.
也就是说,内置类型的默认初始化就是什么也不做。
8.5 11
If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. [ Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2. — end note ]
这句话的意思是,具有自动或者动态存储期的对象在没有初始化的时候执行的是默认初始化,如果没有做那么得到的是不确定的值;静态存储期的对象执行的是零初始化。
比如,
void foo() {
static int i; // zero-initialized, value is 0
int i; // default-initialized, value is indeterminate
int* p = new int // *p is default-initialized, value is indeterminate
}
而零初始化(8.5 5)则将它的值初始化为0:
To zero-initialize an object or reference of type T means:
— if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression,
converted to T;
— ...
换句话说,该书中这句话并不是特别严谨。。不过影响不大,记住像int这样的类型在外面或者有static修饰的时候默认初始化为0,在函数内部的时候不默认初始化就行了。
给后来者参考。
C++的初始化(Initialization)分类,括号中为直译,冒号后为存在这种初始化的声明。
每一种初始化的具体解释可能很长,轻易不能解释清楚,这里从略,有兴趣者可自行Google
Zero initialization(零初始化):static int a;
Default initialization (默认初始化):int a;
Value initialization(值初始化): int s{};
Copy initialization(复制初始化): int d = 0;
Direct initialization(直接初始化):int f (0);
Aggregate initialization(聚合体初始化):struct {int a,b;} g = {1,2};
List initialization(C++11)(列表初始化):int h{0};
Reference initialization(引用初始化):const int& j = 0;
Constant initialization(常量初始化):static int k = 233;
某种初始化的过程中可能存在另一种初始化,例如 List initialization 过程中可能存在 Value initialization
对于内置类型(fundamental types)的变量,Default initialization 没有任何行为,如果变量本身的值不确定,在 Default initialization 之后仍然拥有不确定的值。但如果这个变量是静态变量,首先进行 Zero initialization 然后才进行 Default initialization ,所以是先把变量的值设为0,然后进行一次没有任何行为的初始化,最终的结果是变量值为0.
“书p40之后提到默认初始化时就根本不管定义的位置,都是未定义”
p40之后哪页?所在段落。具体一点。
手机号