C++对象的构造顺序

来源:互联网 发布:爷爷9岁被鬼子杀了知乎 编辑:程序博客网 时间:2024/06/02 05:32

在C++中对象的构造顺序有三种:
(1)局部构造对象顺序
(2)堆对象构造顺序
(3)全局对象构造顺序

(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;                   //0    while( i < 3 )    {        Test a2 = ++i;            //1  2   3    }    if( i < 4 )    {        Test a = a1;              //0    }    else    {        Test a(100);    }    return 0;}

(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 getMi()    {        return mi;    }};int main(){    int i = 0;    Test* a1 = new Test(i);           //0    while( ++i < 10 )        if( i % 2 )            new Test(i);             //1,3,5,7,9    if( i < 4 )        new Test(*a1);    else        new Test(100);               //100    return 0;}

(3)全局对象构造顺序
对象的构造顺序是不确定的
不同的编译器使用不同的规则确定构造顺序

include “test.h”

Test t4("t4");int main(){    Test t5("t5");}

(4)使用goto改变顺序的危害

#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());    return 0;}

下面是g++编译器执行的结果:
这里写图片描述

总结:
这里写图片描述

注:本文参考来自狄泰学院

0 0
原创粉丝点击