1. 程式人生 > >C++函式中的static變數初始化及析構順序

C++函式中的static變數初始化及析構順序

有如下的類:

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的變數可以延遲到使用者第一次進入到初始化程式碼時才執行,而且執行過程可根據使用者輸入而改變,甚至可以按照正確的“先建立後銷燬”進行!