C++函数中的static变量初始化及析构顺序

来源:互联网 发布:印第安老斑鸠 知乎 编辑:程序博客网 时间:2024/06/09 20:48

有如下的类:

class base{public:base(char* pStr){m_pStr = pStr;cout << pStr << " Constructor!" << endl;}~base(){cout << m_pStr << " Destructor!" << endl;}void fund(char* pStr){if (pStr != NULL){static base b(pStr);}}void fund2(){static base e("e");}private:char* m_pStr;};base glb("global");



1. 有如下调用方式

int main(){base loc("local");return 0;}

 

请问输出的信息是什么?

答案:

global Constructor!

local Constructor!

local Destructor!

global Destructor!

 

需要注意的是函数中的static变量由于函数没有被调用而没有被初始化~

那么接下来,我们使用如下代码:

 

int main(){base d("d");int i;cin >> i;if (i == 0){d.fund(NULL);d.fund("R1");d.fund2();}else{d.fund2();d.fund("R2");}return 0;}

 

当用户输入0时

global Constructor!

local Constructor!

R1 Constructor!

e Constructor!

local Destructor!

e Destructor!

R1 Destructor!

global Destructor!

 

当用户输入非0时

global Constructor!

local Constructor!

e Constructor!

R2 Constructor!

local Destructor!

R2 Destructor!

e Destructor!

global Destructor!

 

由此可见,static的变量可以延迟到用户第一次进入到初始化代码时才执行,而且执行过程可根据用户输入而改变,甚至可以按照正确的“先创建后销毁”进行!