如何給對象進行初始化?
一般而言所有的對象都需要一個確定的初始狀態
解決方案
爲每個類都提供一個public的initialize函數
對象創建後立即調用initialize函數進行初始化
(插入9-1.cpp)
上述解決方案initialize只是一個普通的函數,必須顯示的調用
一旦由於失誤的原因,對象沒有初始化,那麼結果將是不確定的
沒有初始化的對象,其內部成員變量的值是不確定的
(插入9-2.cpp)
C++中的類可以定義與類名相同的特殊成員函數
這種與類名相同的成員函數叫做構造函數
構造函數在定義時可以有參數,但是沒有任何返回類型的聲明
構造函數的調用
一般情況下C++編譯器會自動調用構造函數
在一些情況下則需要手動調用構造函數
(插入9-3.cpp)
成員函數的重載
類的成員函數和普通函數一樣可以進行重載,並遵守相同的重載規則
(插入9-4.cpp)
兩個特殊的構造函數
沒有參數的構造函數(默認構造函數)
當類中沒有定義構造函數時,編譯器默認提供一個無參構造函數,並且其函數體爲空
const引用的構造函數(拷貝構造函數)(實質是個重載的構造函數而已)
當類中沒有定義拷貝構造函數時,編譯器默認提供一個拷貝構造函數,簡單的進行成員變量的值複製。
(插入9-5.cpp)(插入9-6.cpp)
數組類的創建
(插入9-7.cpp)
思考:可以直接調用構造函數嗎?如果可以,直接調用構造函數會有什麼情況發生?
解答:可以直接調用構造函數,直接調用構造函數將得到一個臨時對象
(插入10-5.cpp)
因爲構造函數只能被編譯器自動或者在定義時調用。
C++中的類可以使用其他類定義成員變量
如何給對象成員進行初始化?
(插入10-1.cpp)
C++中提供了初始化列表對成員變量進行初始化
語法規則:
Construrtor::Cons ():m1(v1),m2(v2),m3(v3)
{
}
注意:
成員變量的初始化順序與聲明順序相關,與在初始化列表中的順序無關
初始化列表先與構造函數的函數體執行
插曲:
類中的const成員變量是肯定有被分配空間的
類中的const成員變量只是一個只讀變量
編譯器無法直接得到const成員變量的初始值,因此無法進入符號表成爲真正意義上的常量
初始化與賦值不同
初始化是用已經存在的對象或值對正在創建的對象進行初值設置
賦值是用已經存在的對象或者只對已經存在的對象進行值設置
區別:
初始化:被初始化的對象正在創建
賦值:被賦值的對象已經存在
C++中的析構函數:
如何清理被銷燬的對象?
解決方案
爲每個類提供一個public的destroy函數
對象不在被需要時立即手工調用destroy函數進行清理
destroy函數只是一個普通的函數,必須顯示的調用
如果對象銷燬前沒有做清理,那麼狠可能造成資源泄露
在構造函數中申請的資源,需要在對象銷燬前釋放
C++中的類可以定義一個特殊的成員函數清理對象
這個特殊的成員函數叫做析構函數
定義:~ClassName()
析構函數沒有參數也沒有任何返回類型的聲明
析構函數在對象銷燬時自動調用
(插入10-2.cpp)
Array類的進化
(插入10-3.cpp)
構造函數與析構函數的調用秩序
當類中有成員變量是其他類的對象時
首先調用成員變量的析構函數
調用順序與聲明順序相同
之後調用自身類的構造函數
析構函數的調用秩序與對應的構造函數調用秩序相反
(插入10-4.cpp)