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