如果用戶定義的類中沒有顯式的定義任何構造函式,編譯器就會自動為該類型生成默認構造函式,稱為合成的構造函式(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,如整數、整數指針、整數數組等等都不會被編譯器初始化。
相關詞條
-
構造函式
構造函式,是一種特殊的方法。主要用來在創建對象時初始化對象,即為對象成員變數賦初始值,總與new運算符一起使用在創建對象的語句中。特別的一個類可以有多個...
簡介 構造函式與其他方法的區別 C++中的構造函式 C++例子 PHP 構造 -
複製構造函式
hyon hyon hyon
-
默認構造方法
默認構造方法是Java語言的一種語法,是指沒有參數的構造方法,可以分為2種:隱含的、程式中顯式定義的。
-
轉換構造函式
在C++中,類的構造函式可以省略不寫,這時C++會為它自動創建一個隱式默認構造函式(implicit default constructor);也可以由...
-
C#靜態構造函式
包含帶有初始值設定的靜態成員,那么編譯器會自動生成默認的靜態構造函式... 靜態構造函式是C#的一個新特性,在編程過程中用處並不廣,它的主要目的是用於初始化一些靜態的變數。 因為這個構造函式是屬於類...
-
C語言函式參考手冊
印刷日期:2011-12-28圖書簡介:本書是一本C語言函式查詢參考手冊,包含了C語言程式開發中套用的各種函式。 本書內容 本書按照C語言庫函式的頭檔案...
作者:明日科技 -
閉包函式
Closure 所謂“閉包”,指的是一個擁有許多變數和綁定了這些變數的環境的表達式(通常是一個函式),因而這些變數也是該表達式的一部分。
簡介 對象屬性名解析 標識符解析、執行環境和作用域鏈 回到頂部 標識符解析 -
構造器
要學習Java,你必須理解構造器。因為構造器可以提供許多特殊的方法,這個對於初學者經常混淆。但是,構造器和方法又有很多重要的區別。
摘要 繼承 構造器 析構器 -
虛擬函式
虛擬函式是C++語言引入的一個很重要的特性,它提供了“動態綁定”機制,正是這一機制使得繼承的語義變得相對明晰。對繼承體系的使用者而言,此繼承體系內部的多...
虛擬函式的特性 實例展示 虛擬函式的“動態綁定” 內聯函式 程式功能