筆記四十二:C+對象的構造和析構
一、前言
創建一個對象時,常常需要作某些初始化的工作,例如對數據成員賦初值。注意,類的數據成員是不能在聲明時初始化的。
為了解決這個問題,C++提供了構造函數來處理對象的初始化。
同樣,當對象使用完畢,需要銷毀時,也有一個函數用來清理對象,這就是析構函數。
二、構造函數
(一)構造函數定義及其調用
1, 構造函數的定義
(1)C++中的類可以定義與類名相同的特殊成員函數,這種與類名相同的成員函數叫做構造函數。語法:ClassName ( ) ;
(2)構造函數在定義時可以有參數;
(3)沒有任何返回類型的聲明;
2.構造函數的調用
自動調用:一般情況下C++編譯器會自動調用構造函數;
手動調用:在一些情況下則需要手工調用構造函數。
三、析構函數
(一)析構函數定義及其調用
1, 析構函數的定義
(1)C++中的類可以定義一個特殊的成員函數清理對象,這個特殊的成員函數叫做析構函數;語法:~ClassName ( ) ;
(2)析構函數沒有參數也沒有任何返回類型的聲明;
(3)析構函數在對象銷毀時自動被調用。
2, 析構函數的調用
C++編譯器自動調用。
三、單個對象生命周期構造函數和析構函數的調用情況
#include
usingnamespacestd;
classTest
{
public:
Test(void);//構造函數
~Test(void);//析構函數
};
//構造函數
Test::Test(void)
{
cout
}
//析構函數
Test::~Test(void)
{
cout
}
//給對象搭建一個舞台,研究對象的行為
voidobjPlay()
{
//先創建的對象後釋放
Test t1;
}
intmain()
{
objPlay();
system("pause");
return0;
}
運行結果:
我是構造函數!
我是析構函數!
請按任意鍵繼續...
【1】在類Test中,我們定義了兩個函數,之一是跟類同名的函數Test ( ),這個就是構造函數,我們上面說到了,構造函數的聲明沒有任何返回類型。並且構造函數默認是沒有參數的,後面可以寫帶參數的構造函數;
【2】在Test類中,我們定義了另外一個函數~Test( ),根據上面說到的,這個是析構函數,同樣,析構函數沒有任何返回類型;
【3】構造函數和析構函數默認情況下是系統自動調用的。
【4】為什麼我們定義了一個函數objPlay()呢?如果我們不用這個objPlay函數,直接在主函數中定義一個類:
intmain()
{
Test t1;
system("pause");
return0;
}
在聲明對象t1時,按照上面說的,C++編譯器自動調用構造函數,然後這個t1對象是個局部變數,main函數執行完畢時,t1對象才會被銷毀,也就才調用析構函數。但是因為前面有個system(「pause」)語句,執行後系統會停止,那麼這個對象t1就不會銷毀,也就不會去調用析構函數,因此我們只會看到調用構造函數,不會看到調用析構函數。
運行結果:
我是構造函數!
請按任意鍵繼續...
【5】因此,在驗證構造函數、析構函數的調用時,我們需要為我們定義的對象搭建一個舞台,在這個舞台上我們定義一個對象,這個對象在函數執行完成後還可以被銷毀,從而調用析構函數,因此我們就單獨定義了一個函數objPlay。
【6】先看上面完整程序運行後的結果。先後輸出了兩句話「我是構造函數」、「我是析構函數」,這就說明我們定義對象t1時,編譯器自動調用了構造函數,然後對象被銷毀時,編譯器自動調用了析構函數。可以通過單步調試去更清晰的認識這點。

