今天看書,忽然發現自己對默認構造函數/構造函數的理解很模糊,在實際項目中寫類時,這些細節問題並沒有涉及到。因此,就專門對着《C++ Primer Plus》將默認構造函數/構造函數這一塊簡單總結一下。
構造函數:C++用於構建類的新對象時需要調用的函數,該函數無返回類型!(注意:是“無”! 不是空!(void))。
默認構造函數:未提供顯式初始值時,用來穿件對象的構造函數。
以上是二者的定義,但是單從定義很難對二者進行區別,下面依然看代碼。
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 };
上面的注釋中已標出了默認構造函數和構造函數。下面,對二者的區別進行簡單直白易懂的總結:
.
1. 默認構造函數主要是用來完成如下形式的初始化的:
1 testClass classA; 2 // 或者 testClass *classA = new testClass;
在這種情況下,如果沒有提供默認構造函數,編譯器會報錯;
非默認構造函數在調用時接受參數,如以下形式:
1 testClass classA(12,'H'); 2 //或者 testClass *classA = new testClass(12,'H');
2. 如果程序猿沒有定義任何構造函數,則編譯器會自動定義默認構造函數,其形式如 testClass() {}; 可以看出,編譯器自動提供的默認構造函數是 啥也沒有啊 ;
3. 定義默認構造函數有兩種方式,如上述代碼展示的,一是定義一個無參的構造函數,二是定義所有參數都有默認值的構造函數 ;
4. 注意:一個類只能有一個默認構造函數!也就是說上述兩種方式不能同時出現,一般選擇 testClass(); 這種形式的默認構造函數 ;
5. 只要程序猿定義了構造函數,編譯器就不會再提供默認構造函數了,所以,程序猿最好再手動定義一個默認構造函數,以防出現 testClass a; 這樣的錯誤。
