小編給大家分享一下c++控制對(duì)象創(chuàng)建方式和創(chuàng)建數(shù)量的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、成都網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。我們知道,C++將內(nèi)存劃分為三個(gè)邏輯區(qū)域:堆、棧和靜態(tài)存儲(chǔ)區(qū)。既然如此,我稱位于它們之中的對(duì)象分別為堆對(duì)象,棧對(duì)象以及靜態(tài)對(duì)象。通常情況下,對(duì)象創(chuàng)建在堆上還是在棧上,創(chuàng)建多少個(gè),這都是沒有限制的。但是有時(shí)會(huì)遇到一些特殊需求。
1.禁止創(chuàng)建棧對(duì)象
禁止創(chuàng)建棧對(duì)象,意味著只能在堆上創(chuàng)建對(duì)象。創(chuàng)建棧對(duì)象時(shí)會(huì)移動(dòng)棧頂指針以“挪出”適當(dāng)大小的空間,然后在這個(gè)空間上直接調(diào)用類的構(gòu)造函數(shù)以形成一個(gè)棧對(duì)象。而當(dāng)棧對(duì)象生命周期結(jié)束,如棧對(duì)象所在函數(shù)返回時(shí),會(huì)調(diào)用其析構(gòu)函數(shù)釋放這個(gè)對(duì)象,然后再調(diào)整棧頂指針收回那塊棧內(nèi)存。在這個(gè)過程中是不需要operator new/delete操作的,所以將operator new/delete設(shè)置為private不能達(dá)到目的。
可以將構(gòu)造函數(shù)或析構(gòu)函數(shù)設(shè)為私有的,這樣系統(tǒng)就不能調(diào)用構(gòu)造/析構(gòu)函數(shù)了,當(dāng)然就不能在棧中生成對(duì)象了。這樣的確可以,但有一點(diǎn)需要注意,那就是如果我們將構(gòu)造函數(shù)設(shè)置為私有,那么我們也就不能用new來直接產(chǎn)生堆對(duì)象了,因?yàn)閚ew在為對(duì)象分配空間后也會(huì)調(diào)用它的構(gòu)造函數(shù)。所以,如果將構(gòu)造函數(shù)和析構(gòu)函數(shù)都聲明為private會(huì)帶來較大的副作用,最好的方法是將析構(gòu)函數(shù)聲明為private,而構(gòu)造函數(shù)保持為public。
再進(jìn)一步,將析構(gòu)函數(shù)設(shè)為private除了會(huì)限制棧對(duì)象生成外,還有其它影響嗎?是的,這還會(huì)限制繼承。如果一個(gè)類不打算作為基類,通常采用的方案就是將其析構(gòu)函數(shù)聲明為private。為了限制棧對(duì)象,卻不限制繼承,我們可以將析構(gòu)函數(shù)聲明為protected,這樣就兩全其美了。如下代碼所示:
class NoStackObject{ protected: ~NoStackObject(){} public: void destroy(){ delete this ;//調(diào)用保護(hù)析構(gòu)函數(shù) } };