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類不需要額外的清理工作,所以在這個析構函數中麼有定義任何操作,只是輸出一段信息表示類對象的結束。
一般,如果對象創建時申請了內存資源,需要在析構函數中進行合理地釋放。