C++对象构造与析构全流程

对象构造流程

1. 首先,如果有virtual base class constructors,虚基类的构造函数必须被调用,从左往右,从深往浅:

-> 如果有virtual base class constructor位于成员初值列,有任何显示指定的参数都应该传递过去;若没有位于初值列,而virtual base class含有一个默认构造函数,也应该调用。

-> class中的每一个virtual base class subobject的偏移量必须在执行期可被存取。

->  用以支持virtual base class在一个完整对象中只初始化一次的机制,必须被放进来。

2. 其次,如果其base class有构造函数,base class的构造函数必须被调用;

-> 如果base class的构造函数位于成员初值列,有任何显示指定的参数都应该传递过去。

-> 若没有位于初值列,而base class含有一个默认构造(拷贝)函数,也应该调用。

->  如果class是多重继承下的第二或者后继的base class,那么this指针应该有所调整。

3. 如果有虚函数,需要在构造函数中设定vptr指向适当的虚表,基类的vptr在基类构造函数中设定,子类vptr在子类构造函数中设定;

4. 如果一个member没有出现在成员初值列表中,但是该member有一个默认构造函数,那么这个默认构造函数必须被调用;

5. 成员初值列表中的member初始化操作放在constructor的函数体内,且顺序和声明顺序一致。

6. 执行构造函数体中的代码。

 

对象析构流程:

1. destructor的函数体首先执行。

2. 如果class拥有member class object,且该class含有destructor,那么它们会以声明顺序相反的顺序依次被调用。

3. 如果object内含一个vptr,重新被设定指向适当的base class的virtual table。

4. 如果有任何上层的nonvirtual base classes拥有destructor,那么它们会以声明顺序相反的顺序依次被调用。

5. 如果有任何virtual base classes拥有destructor,那么它们会以原来构造顺序相反的顺序依次被调用

你可能感兴趣的:(C++对象构造与析构全流程)