今天看書,突然發現本身對默認構造函數/構造函數的理解很模糊,在實際項目中寫類時,這些細節問題並無涉及到。所以,就專門對着《C++ Primer Plus》將默認構造函數/構造函數這一塊簡單總結一下。函數
構造函數:C++用於構建類的新對象時須要調用的函數,該函數無返回類型!(注意:是「無」! 不是空!(void))。spa
默認構造函數:未提供顯式初始值時,用來穿件對象的構造函數。code
以上是兩者的定義,可是單從定義很難對兩者進行區別,下面依然看代碼。對象
1 class testClass 2 { 3 public: 4 testClass(); /* 默認構造函數 */ 5 testClass(int a, char b); /* 構造函數 */ 6 testClass(int a=10,char b='c'); /* 默認構造函數 */ 7 8 private: 9 int m_a; 10 char m_b; 11 };
上面的註釋中已標出了默認構造函數和構造函數。下面,對兩者的區別進行簡單直白易懂的總結:blog
.編譯器
1. 默認構造函數主要是用來完成以下形式的初始化的:編譯
1 testClass classA; 2 // 或者 testClass *classA = new testClass;
在這種狀況下,若是沒有提供默認構造函數,編譯器會報錯;class
非默認構造函數在調用時接受參數,如如下形式:test
1 testClass classA(12,'H'); 2 //或者 testClass *classA = new testClass(12,'H');
2. 若是程序猿沒有定義任何構造函數,則編譯器會自動定義默認構造函數,其形式如 testClass() {}; 能夠看出,編譯器自動提供的默認構造函數是 啥也沒有啊 ;構造函數
3. 定義默認構造函數有兩種方式,如上述代碼展現的,一是定義一個無參的構造函數,二是定義全部參數都有默認值的構造函數 ;
4. 注意:一個類只能有一個默認構造函數!也就是說上述兩種方式不能同時出現,通常選擇 testClass(); 這種形式的默認構造函數 ;
5. 只要程序猿定義了構造函數,編譯器就不會再提供默認構造函數了,因此,程序猿最好再手動定義一個默認構造函數,以防出現 testClass a; 這樣的錯誤。