程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++構造函數相關使用方式解讀

C++構造函數相關使用方式解讀

編輯:C++入門知識

我們今天將會為大家詳細介紹一下有關C++構造函數的基本應用方式。希望初學者們可以通過本文介紹的內容充分掌握這方面的知識,以便在將來實際應用中獲得幫助,並且在一定程度上加深對這一語言的認知程度。

  • C++位操作基本含義詳解
  • C++ Endian具體操作方法講解
  • C++ switch-case語句應用經驗講解
  • C++連接MySqL數據庫操作代碼解讀
  • C++友元函數基本應用方式解析

我們知道,當定義一個對象時,會按順序做2件事情:

1)分配好內存非靜態數據成員是未初始化的)

2)調用C++構造函數構造函數的本意就是初始化非靜態數據成員)

顯然上面代碼中,CLS obj;這裡已經為obj分配了內存,然後調用默認構造函數,但是默認構造函數還未執行完,卻調用了另一個構造函數,這樣相當於產生了一個匿名的臨時CLS對象,它調用CLS(int)構造函數,將這個匿名臨時對象自己的數據成員m_i初始化為0;但是obj的數據成員並沒有得到初始化。於是obj的m_i是未初始化的,因此其值也是不確定的

從這裡,我們歸納如下:

1)在c++裡,由於構造函數允許有默認參數,使得這種C++構造函數調用構造函數來重用代碼的需求大為減少

2)如果僅僅為了一個構造函數重用另一個構造函數的代碼,那麼完全可以把構造函數中的公共部分抽取出來定義一個成員函數(推薦為private),然後在每個需要這個代碼的構造函數中調用該函數即可

3)偶爾我們還是希望在類的構造函數裡調用另一個構造函數,可以按下面方式做:

在C++構造函數裡調用另一個構造函數的關鍵是讓第二個構造函數在第一次分配好的內存上執行,而不是分配新的內存,這個可以用標准庫的placement new做到:

先看看標准庫中placement new的定義

  1. inline void *__cdecl operator new(size_t, void *_P)  
  2. {  
  3. return (_P);   
  4. }  

可見沒有分配新的內存。

正確的方式:

  1. struct CLS  
  2. {  
  3. int m_i;  
  4. CLS( int i ) : m_i(i){}  
  5. CLS()  
  6. {  
  7. new (this)CLS(0);  
  8. }  
  9. }; 

另: 若C++構造函數調用自身,則會出現無限遞歸調用,是不允許的

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved