美文网首页
C++中对象构造顺序

C++中对象构造顺序

作者: nethanhan | 来源:发表于2017-10-14 10:32 被阅读0次

    单个对象的构造与析构


    • 单个对象创建时构造函数的调用顺序
      • 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++中对象构造顺序

          本文链接:https://www.haomeiwen.com/subject/szdxuxtx.html