您的位置:首页 > 编程语言 > C语言/C++

13、不一样的C++系列--对象构造顺序

2017-06-11 10:26 323 查看

单个对象的构造与析构

单个对象创建时构造函数的调用顺序

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是全局对象,那它的构造顺序就不确定,依编译器而定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 对象构造