2.Global object 的内存保证会在程序激活的时候被清为0.Local objects 配置于程序的堆栈中,heap object 配置于自由空间
中,都不一定会被清为0,它们的内容将是内存上次被使用后的遗迹.
有四种情况,会导致"编译器必须为未声明constructor之class合成一个default constructor".
C++standard把那些合成物称为implicit nontrivial default constructors,被合成出来的constructor只能满足编译器(而非程序)
的需要.(编译器通过插入一些代码来合成).
它之所以能够完成任务,是借着
1."调用member object 或 2.base class 的default construtor
" 或是"
3.或是为每一个object初始化其virtual funciton机制 ( vptr, vtbl)
或
4.virtual base class 机制"而完成的. (__vbcX指向虚基类的指针).
至于没有存在那四种情况而又没有声明任何constructor 的calsses我们说它们拥有的是implicit trivial default constructors,
他们实际上并不会被合成出来.;
在合成的default constructor中,只有 base class subobjects 和 member class objects 会被初始化.(我理解的初始化意思,是调用他们的相应construcor).所有其他的nonstatic data memember,如整数,整数指针,整数数组等等都不会初始化.这些初始化操作对程序而言或许有需要,但对编译器则并非必要.如果程序需要一个" 把某指针设为0"的default construcor,那么提供它的人应该是程序员.
C++新手会犯的错误:
1.任何class 如果没有定义default constructor,就会被合成出一个来.(我的理解是编译器实实在在插入一些代码).
2.编译器合成出来的defualt constructor 会明确设定"class 内每一个 data member 的默认值".
如你所见,没有一个是真的.