C++中的类可以定义多个对象?
那么对象的构造顺序是怎样的?
对于局部对象:
当程序执行流到达对象的定义语句时进行构造
#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 getMi()
{
return mi;
}
};
int main()
{
int i = 0;
Test a1 = i; // Test(int i): 0
while( i < 3 )
{
Test a2 = ++i; // Test(int i): 1, 2, 3
}
goto End;
Test a(100);
End:
printf("a.mi = %d\n", a.getMi()); //因为goto语句跳过了对象初始化,改变了程序执行流,造成灾难性的后果
return 0;
}
对于堆对象
当程序执行流到达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 getMi()
{
return mi;
}
};
int main()
{
int i = 1;
Test* a1 = new Test(i);
while(++i < 10)
{
if(i % 2)
new Test(i);
}
if(i < 4)
{
new Test(*a1); //调用构造函数,使用对象初始化
}
else
{
new Test(*a1);
}
return 0;
}
对于全局对象
对象的构造顺序是不确定的
不同的编译器使用不同的规则确定构造顺序
所以在以后开发中要避免全局对象的相互依赖,全局变量也是
版权声明:本文为weixin_46571142原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。