【c++深度解析2】C ++ 中构造函数的构造顺序和析构函数中的析构顺序

本文深入探讨了C++中构造函数与析构函数的调用顺序,包括单个对象创建、全局对象与栈对象初始化的区别,以及堆对象析构的时机与顺序,通过实例代码清晰展示这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

问题一 : 析构函数的顺序和构造函数的顺序有什么关系

问题二: 单个对象创建时构造函数的调用顺序是怎样的

 

 问题三:有全局对象,栈对象它们的初始化顺序有什么区别

问题四:堆对象什么时候调用析构函数,它们的析构顺序是怎样的?

代码举例




 

  • 问题一 : 析构函数的顺序和构造函数的顺序有什么关系

答:析构函数的顺序和构造函数的顺序相反

 

  • 问题二: 单个对象创建时构造函数的调用顺序是怎样的

答:1.。先调用父类的构造过程(调用父类的构造函数)

        2。再调用成员变量的构造函数(注意:该处构造函数的调用顺序只与申明时有关,与其在初始化列表的顺序无关).

      3. 最后调用自身的构造函数

 

  •  问题三:有全局对象,栈对象它们的初始化顺序有什么区别

  1. 先初始化全局对象(注意:多个全局对象中的初始化顺序与具体的编译器有关,所以工程中尽量少用全局对象,尤其不能全局对象的初始化有相互依赖关系)

2.栈对象构造顺序与程序的执行流有关

 

  • 问题四:堆对象什么时候调用析构函数,它们的析构顺序是怎样的?

堆对象的析构发生在使用delete的时候,与delete的使用顺序有关

 

  • 代码举例

下面看该段代码的输出结果

#include <QCoreApplication>
#include <QDebug>

class Menber
{
    QString ms;
public:
    Menber(QString s)
    {
        ms = s;
        qDebug() << __FUNCTION__ << ms;
    }
    
    
    ~Menber()
    {
        qDebug() << __FUNCTION__ << ms;
    }
    
};

class Test{
    
    Menber ma;
    Menber mb;
    
public:
    Test():mb("mb"),ma("ma")
    {  
        qDebug() << __FUNCTION__;
    }
    
    ~Test()
    {  
        qDebug() << __FUNCTION__;
    }
};

Menber ga("ga");

int main(int argc, char *argv[])
{
    
    Test t;
    
    return 0;
}

分析如上代码:构造函数的顺序,先全局变量 ga 然后 父类构造(此处无父类忽略),然后成员变量构造顺序,有两个ma和mb 顺序往下,所以输出ma,mb 然后自己本身构造函数调用 所以 输出Test ,而析构函数的构造顺序和构造函数的顺序相反,故有如下的输出结果,
输出结果截图如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值