对象的构造往往和构造函数会牵扯在一起,构造函数的函数可能会由非常复杂的逻辑所组成,不同类的构造函数的程序逻辑很可能是相互依赖的,当这种相互依赖一旦成立,那么对象的构造顺序很可能导致难以调试的Bug出现
对象的构造顺序
对于局部对象
当程序执行流到达对象的定义语句时进行构造
对于堆对象
当程序执行到达new语句时创建对象
使用new创建对象将自动触发构造函数的调用
对于全局对象
对象的构造顺序是不确定的
不同编译器使用不同的规则确定构造顺序
例子:
#include "test.h"
Test t4("t4");
int main()
{
Test t5("t5");
}
#include "test.h"
Test t1("t1");
#include "test.h"
Test t2("t2");
#include "test.h"
Test t3("t3");
#ifndef _TEST_H_
#define _TEST_H_
#include <stdio.h>
class Test
{
public:
Test(const char* s)
{
printf("%s\n", s);
}
};
结果:
sice@sice:~$ g++ 21-3.cpp t2.cpp t1.cpp t3.cpp test.h
sice@sice:~$ ./a.out
t3
t1
t2
t4
t5
验证了 对于全局对象对象的构造顺序是不确定的