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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM