共找到2條詞條名為默認構造函數的結果 展開
- 默認構造函數
- 預設構造函數
默認構造函數
默認構造函數
默認構造函數(default constructor)就是在沒有顯式提供初始化式時調用的構造函數。它由不帶參數的構造函數,或者為所有的形參提供默認實參的構造函數定義。如果定義某個類的變數時沒有提供初始化時就會使用默認構造函數。
如果類包含內置或複合類型的成員,則該類就不應該依賴於合成的默認構造函數,它應該定義自己的構造函數來初始化這些成員。
多數情況下,編譯器為類生成一個公有的默認構造函數,只有下面兩種情況例外:
1.一個類顯式地聲明了任何構造函數,編譯器不生成公有的默認構造函數。在這種情況下,如果程序需要一個默認構造函數,需要由類的設計者提供。
2.一個類聲明了一個非公有的默認構造函數,編譯器不會生成公有的默認構造函數。
C++編譯器必須為未聲明構造函數之class合成一個默認構造函數
第一,class 有member object(該member object有default constructor), class需要default constructor調用member object default constructor
第二,如果一個沒有任何constructor的class 派生自一個"帶有default constructor"的base class.那麼它的default constructor會被合成出來。
第三,如果一個class申明了virtual function,,如果該類沒有任何constructor,
編譯器也會為它加default constructor.
(如果用戶有constructor,編譯器會在他的constructor中添加一些code,用來初始化vptr)
第四,一個class(沒有申明任何constructor)派生自一個繼承串鏈,其中有一個或多個virtual base classes,編譯器也會合成出一個default constructor,在其中放入每一個virtual base class的執行期存取操作的的碼,
(如果用戶申明了constructors,編譯器會在constructor中安插virtual base class執行期存取操作的的碼)
上面四種分析合成出的default constructor都是nontrivial default constructors,
不在此情況之內的都trivial default constructors,它們實際上並不會被編譯器合成出來
在合成的default constructors,只有base class subobjects和member class object會
被初始化,所有其它的nonstatic data member,如整數、整數指針、整數數組等等都不會被編譯器初始化。