構造函數與析構函數

c++構造函數和析構函數

構造函數的任務就是初始化類對象的數據成員,無論何時只要類的對象被創建,就會執行構造函數。構造函數的名字和類名相同,和其他函數不一樣的是,構造函數沒有返回類型。構造函數也有一個參數列表(可能爲空的)參數列表和一個可能爲空的函數體。C++規定每個類都必須有構造函數,如果沒有聲明構造函數,那麼編譯器就會爲它產生一個默認構造函數,這個默認構造函數沒有任何參數,也不做任何額外的事情。

class teacher
{
protected:
	string m_strname;
public:
	//構造函數
	//參數表示teacher類對象的名字
	teacher(string strname)
	{
		//使用參數對屬性賦值,進行初始化
		//使得這個對象一經創建,就有了合適的姓名屬性
		m_strname = strname;
	};
	void prepareLession();
private:
};

在構造函數中,利用傳遞進來的參數對對象的屬性m_strname進行初始化,這樣在定義teacher對象時,就需要給定其名字參數。

需要注意的是,如果類已經有了顯式定義的構造函數,編譯器就不會再爲其生成默認的構造函數。例如,在teacher類擁有顯式聲明的構造函數之後,如果函數採用如下的形式定義對象,就會闡述編譯錯誤。

//定義一個沒有名字的老師

Teacher MrUnknown;

這時編譯器就會提示出錯,因爲這個類已經沒有默認的構造函數了,而唯一的構造函數是需要給出參數。

析構函數:

與構造函數很相似,她的名字是由類名前加“~”構成的,同時析構函數也沒有返回值。同樣,如果類沒有顯式地聲明析構函數,編譯器也會爲其自動產生一個析構函數,構造函數與析構函數的唯一不同就是在於析構函數不接受任何參數。

下面來爲teacher類加上構造函數。

class teacher
{
protected:
	string m_strname;
public:
	//構造函數
	//參數表示teacher類對象的名字
	teacher(string strname)
	{
		//使用參數對屬性賦值,進行初始化
		//使得這個對象一經創建,就有了合適的姓名屬性
		m_strname = strname;
	};
	~teacher()
	{
		std::cout << "game over" << std::endl;
	}
	void prepareLession();
private:
};

因爲teacher類不需要額外的清理工作,所以在這個析構函數中麼有定義任何操作,只是輸出一段信息表示類對象的結束。

一般,如果對象創建時申請了內存資源,需要在析構函數中進行合理地釋放。

發佈了48 篇原創文章 · 獲贊 146 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章