C++的默認構造函數與構造函數

今天看書,突然發現本身對默認構造函數/構造函數的理解很模糊,在實際項目中寫類時,這些細節問題並無涉及到。所以,就專門對着《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; 這樣的錯誤。

相關文章
相關標籤/搜索