《c++編程思想》閱讀筆記(6)
第4章:初始化與清除,內容太多,故分爲幾篇博客來進行歸納:)
缺省構造函數就是不帶任何參數的構造函數。當編譯器需要創建一個對象而又不知任何細節時,缺省的構造函數就顯得非常重要。比如,我們有一個類Y,並用它來定義對象:
Y y4[2] = {Y(1)};
編譯器就會報告找不到缺省的構造函數,數組中的第二個對象想不帶參數來創建,所以編譯器就去找缺省的構造函數。實際上,如果我們只是簡單地定義了一個個Y對象的數組:
Y y5[7];
或一個單一的對象:
Y y;
編譯器會報告同樣的錯誤,因爲它必須用一個缺省的構造函數去初始化數組中的每個對象。
缺省構造函數是如此重要,所以在一個構造類型(struct或class)中沒有構造函數時,編譯器就會自動創建一個。如下面的例子會正常運行:
class Z {
int i; // private
}; // no constructor
Z z, z2[10];
然而,一旦有構造函數而沒有缺省構造函數,上面的對象定義就會產生一個編譯錯誤
對於一個c++的新手來說,自動產生的缺省構造函數並不會使編程變得容易。它實際上要求與已有的c代碼保持向後兼容。在c中,創建一個struct數組的情況很常見,而在c++中,在沒有缺省構造函數時,這會引起一個編譯錯誤。
如果我們僅僅因爲風格問題就去修改我們的c代碼,然後用c++重新編譯,也許我們會很不樂意。當將c代碼在c++中編譯時,我們總會遇到這樣和那樣的編譯錯誤,但這些編譯錯誤都是c++編譯器所發現的c的不良代碼。因爲c++的規則更嚴格。事實上,用c++編譯器去編譯c代碼是一個發現潛在的錯誤的很好的方法。
(這篇有點短,因爲只剩這個內容了,有關該章的其他內容可以參考我的前兩篇博客:))