(參考自《深入理解c++物件模型》)
」c++新手一般有兩個常見的誤解:
任何class如果沒有定義default constructor,就會被合成乙個出來.
編譯器合成出來的default constructor會明確設定class 內每乙個data member的預設值.」
現在主要解釋第一條為什麼是錯誤的,根據《深入理解c++物件模型》,」default constructor 在需要的時候被編譯器產生出來」,以下就是4種」需要的時候」:
1). 該類含有乙個成員物件而後者有乙個預設建構函式.
如果乙個類沒有任何建構函式,但它含有乙個成員函式,這個成員函式含有預設建構函式,那麼編譯器就需要為這個類合成乙個預設建構函式並呼叫那個成員的預設建構函式.
2). 該類繼承自乙個基類且後者帶有預設建構函式.
原理和1)類似
3). 該類帶有乙個虛函式
編譯器需要合成乙個預設建構函式並在編譯期發生兩種擴張操作:」乙個virtual function table(在cfront中被稱為vtbl)會被編譯器產生出來,內放class的virtual function位址」,」在每乙個class object中,乙個額外的pointer member(也就是vptr)會被編譯器合成出來,內含相關的class vtbl位址」.
4). 該類派生自乙個繼承串鏈,其中有乙個或多個虛基類
不同編譯器對虛基類的實現不同,但編譯器需要合成乙個預設建構函式並改變對虛基類」執行訪問操作」的那些碼,使得對虛基類的操作延遲至執行期才決定下來.
同理,如果類沒有定義拷建構函式,那麼編譯器會視該類有沒有展現」bitwise copy semantics「(位逐次拷貝語義來決定是否合成拷貝建構函式),在以下四種情況下類不展現出」bitwise copy semantics「:
1). 該類含有乙個成員物件而後者有乙個拷貝建構函式.
2). 該類繼承自乙個基類且後者帶有拷貝建構函式.
3). 該類帶有乙個虛函式
4). 該類派生自乙個繼承串鏈,其中有乙個或多個虛基類
可見,編譯器在類沒有定義拷貝建構函式時合成拷貝建構函式的要求與預設建構函式類似,唯一不同的是如果編譯器不合成預設建構函式,那麼將不會對成員進行任何初始化操作,如果編譯器不合成拷貝建構函式,那麼將會進行」bitwise copy」(位逐次拷貝,按位逐位拷貝),如果成員有指標,那麼位逐次拷貝進行的是淺複製.
編譯器合成複製建構函式
定義 只有單個形參,該形參是對本類型別物件的引用 常用const修飾 這樣的建構函式成為複製建構函式。使用方式 1 顯示使用 用乙個同型別的物件初始化該物件時 2 隱式使用 將該型別的物件傳遞給函式或從函式返回該型別物件時。三種型別的複製建構函式 bitwise copy constructor 逐...
編譯器必須為類合成預設建構函式的情況
有4種情況,編譯器必須為未宣告建構函式的類合成預設建構函式,c standard將其稱作有用的隱式預設建構函式。被合成出來的建構函式只能滿足編譯器的需要,而非程式。在合成的預設建構函式中,只有基類子物件和成員物件會被初始化,所有其他的非靜態資料成員都不會被初始化。提供初始化操作的人應該是程式設計師。...
編譯器角度看C 複製建構函式
關於複製建構函式的簡單介紹,可以看我以前寫過的一篇文章 複製控制之複製建構函式該文章中介紹了複製建構函式的定義 呼叫時機 也對編譯器合成的複製建構函式行為做了簡單說明。本文因需要會涉及到上文的一些知識點,但還是推薦先閱讀上文。本文主要從編譯器角度對複製建構函式進行分析,糾正以前對複製建構函式的一些錯...