默認構造函式

默認構造函式所屬現代詞,指的是在沒有顯式提供初始化式時調用的構造函式。

默認構造函式(default constructor)就是在沒有顯式提供初始化式時調用的構造函式。它由不帶參數的構造函式,或者為所有的形參提供默認實參的構造函式定義。如果定義某個類的變數時沒有提供初始化式就會使用默認構造函式。
如果用戶定義的類中沒有顯式的定義任何構造函式,編譯器就會自動為該類型生成默認構造函式,稱為合成的構造函式(synthesized 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,如整數、整數指針、整數數組等等都不會被編譯器初始化。

相關詞條

相關搜尋

熱門詞條

聯絡我們