C++中构造函数和析构函数的调用顺序
一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序。举例说明:
CreateAndDestroy类的定义
CreateAndDestroy类的成员函数的定义
测试函数
构造函数和析构函数的调用顺序:
分析
全局作用域内定义的对象的构造函数,在文件内任何其他函数(包括main函数)开始执行之前调用,当main函数执行结束时,相应的析构函数被调用,如上面的Object 1.
exit函数迫使程序立即结束,不执行自动对象的析构函数。当程序中检测到输入中有错误,或者程序要处理的文件不能打开时,常常使用exit函数来终止程序。abort函数的执行情况与exit
函数类似,但是迫使程序立刻终止,不允许调用任何对象的析构函数。通常使用abort函数指示程序的非正常终止。
当程序执行到自动局部对象的定义处时,该对象的构造函数被调用;当程序执行离开对象的作用域时,相应的析构函数被调用。如果程序的终止是由调用exit函数或者abort函数完成,
那么自动对象的析构函数将不被调用。
static 局部对象的构造函数只调用一次,即在程序第一次执行到该对象的定义处时;而相应的析构函数的调用则发生在main函数结束或者程序调用exit函数。全局或静态对象的的撤销
顺序与它们建立的顺序正好相反。abort函数的调用终止程序时,static对象的析构函数将不被调用。
在测试函数的第10行定义了全局static对象first, 在main中任何语句执行之前,调用它的构造函数;而在运行所有其他对象的析构函数之后程序终止,调用它的析构函数。
对象second和fourth都是局部自动对象,对象third是一个static局部对象。当程序执行到每个对象声明处时,调用它们的构造函数;当程序执行到main函数结尾时,依次调用对象fourth和second的析构函数(与构造函数的调用顺序相反)。因为对象third是static局部对象,所以直到程序终止时,他才撤销,即对象third的析构函数在全局对象first的析构函数调用之前、在所有其它对象撤销之后调用。
第25行的create函数声明了3个对象:fifth和senventh是局部自动对象,sixth是局部static对象。程序执行到create函数结尾时,依次调用对象seventh和fifth的析构函数(与构造函数调用的顺序相反)。由于sixth是static,因此直到程序终止时它才撤销。sixth的析构函数的调用发生在third和first的析构函数之前及其它所有对象撤销之后。