深入理解C++对象模型默认构造函数笔记

来源:互联网 发布:火车票生成器软件 编辑:程序博客网 时间:2024/05/16 04:54

 

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 的默认值".

如你所见,没有一个是真的.

原创粉丝点击