新聞中心
我們今天將會(huì)為大家詳細(xì)介紹一下有關(guān)C++構(gòu)造函數(shù)的基本應(yīng)用方式。希望初學(xué)者們可以通過(guò)本文介紹的內(nèi)容充分掌握這方面的知識(shí),以便在將來(lái)實(shí)際應(yīng)用中獲得幫助,并且在一定程度上加深對(duì)這一語(yǔ)言的認(rèn)知程度。#t#

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)新會(huì)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
我們知道,當(dāng)定義一個(gè)對(duì)象時(shí),會(huì)按順序做2件事情:
1)分配好內(nèi)存(非靜態(tài)數(shù)據(jù)成員是未初始化的)
2)調(diào)用C++構(gòu)造函數(shù)(構(gòu)造函數(shù)的本意就是初始化非靜態(tài)數(shù)據(jù)成員)
顯然上面代碼中,CLS obj;這里已經(jīng)為obj分配了內(nèi)存,然后調(diào)用默認(rèn)構(gòu)造函數(shù),但是默認(rèn)構(gòu)造函數(shù)還未執(zhí)行完,卻調(diào)用了另一個(gè)構(gòu)造函數(shù),這樣相當(dāng)于產(chǎn)生了一個(gè)匿名的臨時(shí)CLS對(duì)象,它調(diào)用CLS(int)構(gòu)造函數(shù),將這個(gè)匿名臨時(shí)對(duì)象自己的數(shù)據(jù)成員m_i初始化為0;但是obj的數(shù)據(jù)成員并沒(méi)有得到初始化。于是obj的m_i是未初始化的,因此其值也是不確定的
從這里,我們歸納如下:
1)在c++里,由于構(gòu)造函數(shù)允許有默認(rèn)參數(shù),使得這種C++構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)來(lái)重用代碼的需求大為減少
2)如果僅僅為了一個(gè)構(gòu)造函數(shù)重用另一個(gè)構(gòu)造函數(shù)的代碼,那么完全可以把構(gòu)造函數(shù)中的公共部分抽取出來(lái)定義一個(gè)成員函數(shù)(推薦為private),然后在每個(gè)需要這個(gè)代碼的構(gòu)造函數(shù)中調(diào)用該函數(shù)即可
3)偶爾我們還是希望在類的構(gòu)造函數(shù)里調(diào)用另一個(gè)構(gòu)造函數(shù),可以按下面方式做:
在C++構(gòu)造函數(shù)里調(diào)用另一個(gè)構(gòu)造函數(shù)的關(guān)鍵是讓第二個(gè)構(gòu)造函數(shù)在第一次分配好的內(nèi)存上執(zhí)行,而不是分配新的內(nèi)存,這個(gè)可以用標(biāo)準(zhǔn)庫(kù)的placement new做到:
先看看標(biāo)準(zhǔn)庫(kù)中placement new的定義
- inline void *__cdecl operator new(size_t, void *_P)
- {
- return (_P);
- }
可見(jiàn)沒(méi)有分配新的內(nèi)存。
正確的方式:
- struct CLS
- {
- int m_i;
- CLS( int i ) : m_i(i){}
- CLS()
- {
- new (this)CLS(0);
- }
- };
另: 若C++構(gòu)造函數(shù)調(diào)用自身,則會(huì)出現(xiàn)無(wú)限遞歸調(diào)用,是不允許的
本文名稱:C++構(gòu)造函數(shù)相關(guān)使用方式解讀
標(biāo)題URL:http://m.fisionsoft.com.cn/article/djddigj.html


咨詢
建站咨詢
