版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1.问题
- C++中的类可以定义多个对象, 那么对象构造的顺序是怎样的?
- 局部对象的构造顺序依赖于程序的执行流
- 堆对象的构造顺序依赖于new的使用顺序
- 全局对象的构造顺序是不确定的
1.1 局部对象的构造顺序
- 对于局部对象:当程序执行流到达对象的定义语句时进行构造
-
#include <stdio.h>
-
-
class Test
-
{
-
private:
-
int mi;
-
-
public:
-
-
Test(
int i)
-
{
-
mi = i;
-
printf(
"Test(int i): %d\n", mi);
-
}
-
-
Test(
const Test &obj)
-
{
-
mi = obj.mi;
-
printf(
"Test(const Test &obj): %d\n", mi);
-
}
-
};
-
-
int main()
-
{
-
int i =
0;
-
Test a1 = i;
-
-
while (i <
3)
-
{
-
Test a2 = ++i;
-
}
-
-
if (i <
4 )
-
{
-
Test a = a1;
// 调用拷贝构造函数
-
}
-
else
-
{
-
Test a(
100);
-
}
-
-
getchar();
-
-
return
0;
-
}
- 运行结果:
1.2 堆对象的构造顺序
- 对于堆对象
- 当程序执行流到达new语句时创建对象
- 使用new创建对象将自动触发构造函数的调用
-
#include <stdio.h>
-
-
class Test
-
{
-
private:
-
int mi;
-
-
public:
-
-
Test(
int i)
-
{
-
mi = i;
-
printf(
"Test(int i): %d\n", mi);
-
}
-
-
Test(
const Test &obj)
-
{
-
mi = obj.mi;
-
printf(
"Test(const Test &obj): %d\n", mi);
-
}
-
};
-
-
-
int main()
-
{
-
int i =
0;
-
Test * a1 =
new Test(i);
// Test(int i): 0
-
-
while (++i <
10)
// Test(int i):1,3,5,7,9
-
{
-
if (i %
2)
-
new Test(i);
-
}
-
if ( i <
4 )
-
new Test(*a1);
-
else
-
new Test(
100);
// Test(int i): 100
-
-
getchar();
-
-
return
0;
-
}
- 运行结果:
1.3 全局对象的构造
- 对于全局对象
- 对象的构造顺序是不确定的
- 不同的编译器使用不同的规则确定构造顺序
- test.h
-
#ifndef _
TEST_H_
-
#define _
TEST_H_
-
-
#include <
stdio
.h>
-
-
class
Test
-
{
-
public:
-
Test(const char *s)
-
{
-
printf(
"%s\n", s);
-
}
-
};
-
-
#endif
- test.cpp
-
#include "test.h"
-
-
Test t4("t4");
-
-
int main()
-
{
-
Test t5("t5");
-
}
- t1.cpp
-
#include "test.h"
-
-
Test t1("t1");
- t2.cpp
-
#include "test.h"
-
-
Test t2("t2");
- t3.cpp
-
#include "test.h"
-
-
Test t3("t3");
- 不同编译器执行结果
2.小结
- 局部对象的构造顺序依赖于程序的执行流
- 堆对象的构造顺序依赖于new的使用顺序
- 全局对象的构造顺序是不确定的