目录
问题四:堆对象什么时候调用析构函数,它们的析构顺序是怎样的?
-
问题一 : 析构函数的顺序和构造函数的顺序有什么关系
答:析构函数的顺序和构造函数的顺序相反
-
问题二: 单个对象创建时构造函数的调用顺序是怎样的
答: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 ,而析构函数的构造顺序和构造函数的顺序相反,故有如下的输出结果,
输出结果截图如下: