文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
这学期开了C++课,讲到构造函数和析构函数的时候我产生了一个疑问,老师说要学了操作系统才能明白,暂时先记录一下,以后回来解决。
很早以前就知道main()是程序执行的入口,一直理解的都是操作系统从main()开始的地方执行程序,但是C++又说析构函数在程序执行之后才被自动调用,我的问题就是程序最后的”return 0″和析构函数谁先执行?还有就是全局实例构造函数的调用顺序又是怎么样的?
为了先得到结论,我用VS2008写了一段程序来实验这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include "stdafx.h" #include <iostream> #include <string> using namespace std; class Demo { public: string objName; Demo(string Name) { this->objName = Name; cout << objName << " Constructor called" << endl; } ~Demo() { cout << objName << "Destructor called" << endl; } }; Demo obj1("obj1"); int main() { cout << "Main() start" << endl; Demo obj2("obj2"); return int(&(cout << "Main() end" << endl)); } |
最后的结果很奇怪,很奇怪…
obj1 Constructor called
Main() start
obj2 Constructor called
Main() end
obj2Destructor called
obj1Destructor called
1、全局实例的构造函数在main()之前被调用
2、析构函数都在main()之后被调用
悲剧了,第1个构造函数和最后2个析构函数居然不是main()来调用,那它们到底是谁调用的?显然在main()执行之前程序进行了一些列操作,至少包括全局变量的生成(因为全局变量是定义在堆上的)和main()参数的传递…暂时无视这个问题,欲知后事如何,请看下回分解…
转载请注明:Slyar Home » 关于构造/析构函数与主函数调用顺序的疑惑