在國內(nèi)的C++圖書中,關(guān)于構(gòu)造函數(shù)的說明,要么是錯誤的,要么沒有真正說清楚構(gòu)造函數(shù)的作用,因此在我的視頻中,對構(gòu)造函數(shù)的講解,也有一部分錯誤的敘述。對于C++構(gòu)造函數(shù)一些錯誤認識的傳播,我也相當(dāng)于起了推波助瀾的作用,在此反省一下,并給出正確的敘述。
(感謝西安軟件園的王先生為我指出錯誤,感謝網(wǎng)友backer幫助我找出正確的答案。)
在光盤VC02中,在介紹構(gòu)造函數(shù)時,我說:“構(gòu)造函數(shù)最重要的作用是創(chuàng)建對象本身,對象內(nèi)存的分配由構(gòu)造函數(shù)來完成的”,這句話是錯的,對象內(nèi)存的分配和構(gòu)造函數(shù)沒有關(guān)系,對象內(nèi)存的分配是由編譯器來完成的,構(gòu)造函數(shù)的作用是對對象本身做初始化工作,也就是給用戶提供初始化類中成員變量的一種方式,在類對象有虛表的情況下,構(gòu)造函數(shù)還對虛表進行初始化。
另外,我說:“C++又規(guī)定,如果一個類沒有提供任何的構(gòu)造函數(shù),則C++提供一個默認的構(gòu)造函數(shù)(由C++編譯器提供)”,這句話也是錯誤的,正確的是:
如果一個類中沒有定義任何的構(gòu)造函數(shù),那么編譯器只有在以下三種情況,才會提供默認的構(gòu)造函數(shù):
1、如果類有虛擬成員函數(shù)或者虛擬繼承父類(即有虛擬基類)時;
2、如果類的基類有構(gòu)造函數(shù)(可以是用戶定義的構(gòu)造函數(shù),或編譯器提供的默認構(gòu)造函數(shù));
3、在類中的所有非靜態(tài)的對象數(shù)據(jù)成員,它們對應(yīng)的類中有構(gòu)造函數(shù)(可以是用戶定義的構(gòu)造函數(shù),或編譯器提供的默認構(gòu)造函數(shù))。