单个对象的构造与析构
- 单个对象创建时构造函数的调用顺序
- 1、调用父类的构造过程
- 2、调用成员变量的构造函数(调用顺序与声明顺序相同)
- 3、调用类自身的构造函数
- 析构函数与对应构造函数的调用顺序相反
- 多个对象析构时
- 析构顺序与构造顺序相反
- 对于栈对象和全局对象,类似于入栈与出栈的顺序,最后构造的对象被最先析构
- 堆对象的析构发生在使用delete的时候,与delete的使用顺序相关
局部对象
- 对于局部对象
- 当程序执行流到达对象的定义语句时进行构造
举个🌰:
int i = 0;
Test a1 = i;
while( i < 3 )
{
Test a2 = ++i;
}
if( i < 4 )
{
Test a = a1;
}
else
{
Test a(100);
}
在这段代码里Test类构造顺序是按照程序的执行流依次往下进行。
堆对象
- 对于堆对象
- 当程序执行流到达new语句时创建对象
- 使用new创建对象将自动触发构造函数的调用
再次举🌰:
int i = 0;
Test* a1 = new Test(i); // Test(int i): 0
while( ++i < 10 )
if( i % 2 )
new Test(i); // Test(int i): 1, 3, 5, 7, 9
if( i < 4 )
new Test(*a1);
else
new Test(100); // Test(int i): 100
在这段代码中只有执行new时在堆空间分配空间后才执行构造方法。
全局对象
- 对于全局对象
- 对象的构造顺序是不确定的
- 不同的编译器使用不同的规则确定构造顺序
最后举一次🌰:
#include "test.h"
Test t4("t4");
int main()
{
Test t5("t5");
}
这里的Test是全局对象,那它的构造顺序就不确定,依编译器而定。