C++函式中的static變數初始化及析構順序
阿新 • • 發佈:2019-01-31
有如下的類:
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的變數可以延遲到使用者第一次進入到初始化程式碼時才執行,而且執行過程可根據使用者輸入而改變,甚至可以按照正確的“先建立後銷燬”進行!