小編給大家分享一下c++控制對象創(chuàng)建方式和創(chuàng)建數(shù)量的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

我們知道,C++將內(nèi)存劃分為三個邏輯區(qū)域:堆、棧和靜態(tài)存儲區(qū)。既然如此,我稱位于它們之中的對象分別為堆對象,棧對象以及靜態(tài)對象。通常情況下,對象創(chuàng)建在堆上還是在棧上,創(chuàng)建多少個,這都是沒有限制的。但是有時會遇到一些特殊需求。
1.禁止創(chuàng)建棧對象
禁止創(chuàng)建棧對象,意味著只能在堆上創(chuàng)建對象。創(chuàng)建棧對象時會移動棧頂指針以“挪出”適當(dāng)大小的空間,然后在這個空間上直接調(diào)用類的構(gòu)造函數(shù)以形成一個棧對象。而當(dāng)棧對象生命周期結(jié)束,如棧對象所在函數(shù)返回時,會調(diào)用其析構(gòu)函數(shù)釋放這個對象,然后再調(diào)整棧頂指針收回那塊棧內(nèi)存。在這個過程中是不需要operator new/delete操作的,所以將operator new/delete設(shè)置為private不能達到目的。
可以將構(gòu)造函數(shù)或析構(gòu)函數(shù)設(shè)為私有的,這樣系統(tǒng)就不能調(diào)用構(gòu)造/析構(gòu)函數(shù)了,當(dāng)然就不能在棧中生成對象了。這樣的確可以,但有一點需要注意,那就是如果我們將構(gòu)造函數(shù)設(shè)置為私有,那么我們也就不能用new來直接產(chǎn)生堆對象了,因為new在為對象分配空間后也會調(diào)用它的構(gòu)造函數(shù)。所以,如果將構(gòu)造函數(shù)和析構(gòu)函數(shù)都聲明為private會帶來較大的副作用,最好的方法是將析構(gòu)函數(shù)聲明為private,而構(gòu)造函數(shù)保持為public。
再進一步,將析構(gòu)函數(shù)設(shè)為private除了會限制棧對象生成外,還有其它影響嗎?是的,這還會限制繼承。如果一個類不打算作為基類,通常采用的方案就是將其析構(gòu)函數(shù)聲明為private。為了限制棧對象,卻不限制繼承,我們可以將析構(gòu)函數(shù)聲明為protected,這樣就兩全其美了。如下代碼所示:
class NoStackObject{
protected:
~NoStackObject(){}
public:
void destroy(){
delete this ;//調(diào)用保護析構(gòu)函數(shù)
}
};
新聞名稱:c++控制對象創(chuàng)建方式和創(chuàng)建數(shù)量的方法-創(chuàng)新互聯(lián)
地址分享:http://www.chinadenli.net/article12/iidgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計公司、微信公眾號、靜態(tài)網(wǎng)站、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容