轉載:https://blog.csdn.net/bear_n/article/details/72798301
對於C++默認構造函數,我曾經有兩點誤解:
- 類如果沒有定義任何的構造函數,那么編譯器(一定會!)將為類定義一個合成的默認構造函數;
- 合成默認構造函數會初始化類中所有的數據成員;
在看《Effective C++》時,條款05《了解C++默認編寫並調用哪些函數》中說到“….惟有當這些函數被需要(被調用),它們才會被編譯器創建出來。”
“這些函數“指的是編譯器版本的拷貝構造函數、賦值操作符和析構函數,如果類中沒有生命任何構造函數,編譯器還會為類聲明一個default默認構造函數。
這些函數都是public且inline的;
也就是說,默認構造函數“被需要”的時候編譯器才會幫我們合成,那什么情況才是默認構造函數”被需要“呢?
這個問題《Effective C++》並沒有給出答案,直到看了《深度探索C++對象模型》,才明白了編譯器何時才會幫我們合成一個默認構造函數。
什么是默認構造函數?
默認構造函數是可以不用實參進行調用的構造函數,它包括了以下兩種情況:
- 沒有帶明顯形參的構造函數。
- 提供了默認實參的構造函數。
類設計者可以自己寫一個默認構造函數。編譯器幫我們寫的默認構造函數,稱為“合成的默認構造函數”。
強調“沒有帶明顯形參”的原因是,編譯器總是會為我們的構造函數形參表插入一個隱含的this指針,所以”本質上”是沒有不帶形參的構造函數的,只有不帶明顯形參的構造函數,它就是默認構造函數。