在使用任意對象之前,我們都需要保證其已經被初始化,否則也許會發生不可預見性錯誤,比如,我們在比較一個變量的時候,它只是被聲明出來但是沒有被初始化,那麼就會發生報錯。

C++中類對象的初始化發生在構造函數身上,我們知道構造函數的作用是:創建對象,並且為新對象賦初值。

構造函數:初始化的方式有兩種:
1.構造函數內部賦值;
2.初始化列表;(高效,少調用賦值運算)

C++內置類型以外的其他任意自定義對象,初始化的重任就落在構造函數的身上,所以構造函數裏面需要對,對象的每一個成員變量初始化,但是要嚴格區分初始化和賦值的區別。

這裏介紹一個我們理想認為的初始化的構造函數,但實際卻不是初始化,是賦值!!!這裏的構造函數函數,調用過程是,首先調用了默認的構造函數,為每一個成員變量設置了初始值,然後再給這些成員變量賦予了一個新值,那麼調用默認的構造函數這一操作就多此一舉了,與我們設想不符。

great expectation 初始化之後的項目目錄的用途_初始化

如何優化這個構造所以這裏需要初始化列表,

great expectation 初始化之後的項目目錄的用途_構造函數_02

初始化列表有序:
基類的成員變量比子類的更早初始化,子類的成員實際初始化的順序嚴格按照變量在頭文件中聲明的順序執行,與初始化列表中的順序無關。
所以,要防止變量之間相互調用,因初始化順序而導致的問題。

沒有缺省構造函數的類成員變量,引用和const修飾的成員必須使用初始化列表進行初始化。

靜態對象:
靜態對象,其壽命從被構造出來一直存活到程序終止,也就是説靜態對象的析構函數會在main函數結束時自動被調用。
C++對定義於不同編譯單元的靜態全局對象的初始化相對次序沒有明確定義。
所以,如果一個靜態全局對象初始化時調用了另一個單元的靜態全局對象,它所用到的這個對象也許並未被初始化,那麼就會發生錯誤,這種問題如何解決?
解決方式:將每個靜態全局對象放在自己的專屬函數裏面(該對象在此函數中被聲明為static),這個函數返回一個指向這個靜態全局對象的引用,如果要調用靜態全局對象,直接調用這個函數即可,這樣我們可以在函數內部給未初始化的對象初始化,這種方式就是“Singleton(單例)模式”的手法。