zoukankan      html  css  js  c++  java
  • 第24课经典的问题(上)---------对象的构造顺序与析构顺序

    当程序中存在多个对象的时候,如何确定这些对象的析构顺序?

    关于析构的疑问
    单个对象创建时构造函数的调用顺序
    1. 调用父类的构造过程(后续再说)
    2. 调用成员变量的构造函数(调用顺序与声明顺序相同)---------有可能某个类,它里面的成员是其他类的对象。此时就调用成员变量的构造函数。
    3. 调用类自身的构造函数

    析构函数与对应构造函数的调用顺序相反

    多个对象析构时
    同样遵循析构顺序与构造顺序相反


    实例分析
    构造与析构顺序

    #include <stdio.h>
    
    class Member
    {
        const char* ms;
    public:
        Member(const char* s)
        {
            printf("Member(const char* s): %s
    ", s);
            
            ms = s;
        }
        ~Member()
        {
            printf("~Member(): %s
    ", ms);
        }
    };
    
    class Test
    {
        Member mA;
        Member mB;
    public:
        Test() : mB("mB"), mA("mA")
        {
            printf("Test()
    ");
        }
        ~Test()
        {
            printf("~Test()
    ");
        }
    };
    
    Member gA("gA");
    
    int main()
    {
        Test t; 
        
        return 0;
    }

    构造函数的调用顺序:

    gA    mA  mB  Test()

    析构函数的调用顺序:

    ~Test()  

    ~Member():mB

    ~Member():mA

    ~Member():gA

    关于析构的答案
    析构的过程与构造的过程是相反的。
    对于栈对象和全局对象,类似于入栈与出栈的顺序,最后构造的对象被最先析构
    堆对象的析构发生在使用delete的时候,与delete的使用顺序相关。













  • 相关阅读:
    xUtils
    android各类开发框架汇总
    The connection to adb is down, and a severe error has occured.问题解决
    android系统自带主题和自定义主题
    gson处理json和java对象互转
    android解析json数据
    andrid源码目录分析
    JavaScript学习笔记(1)字符串方法
    0day学习笔记(3)Windows定位API引起的惨案(原理)
    内存分页
  • 原文地址:https://www.cnblogs.com/-glb/p/11854220.html
Copyright © 2011-2022 走看看