对于C++程序而言, 程序执行的入口总是main
函数. 怎样才能在执行main
函数之前执行一段代码呢? 答案是全局对象 (global object). 程序在执行时因为会先初始化全局变量, 当这个全局变量是一个对象时, 自然会调用相应的构造函数, 这时构造函数中的代码就得以执行.
那怎样在main
函数退出之后再执行一段代码? 答案依然是全局对象. 当程序退出时, 全局变量必须销毁, 自然会调用全局对象的析构函数, 剩下的就同构造函数一样了.
#include <iostream> using namespace std; class A { public: A() { cout << "1" << endl; } ~A() { cout << "4" << endl; } }; A a; int main(int argc, char* argv[]) { cout << "2" << endl; cout << "3" << endl; return 0; }
P.S. 本来想通过汇编进一步分析的, 无奈功力还不够深厚, 希望以后能够搞懂. 若有高人了解, 还望指点.
不需要通过汇编,C/C++的运行层会在main前调用类似init的函数,main后调用类似exit的函数,所有全局类的构造和析构都放在这两个函数里。而且这两个函数不仅C++能用,C也有方法用的。具体可以去看gcc关于C runtime的那块,有本书《程序员的自我修养》讲的很详细
ReplyDelete@Googol Lee 感谢解答, C语言我只知道可以用onexit()在main退出之后执行代码. 这本书久仰大名, 有时间一定要拜读一下.
ReplyDelete错了, 应该是atexit()
ReplyDelete