日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C/Cpp / 如何定义一个只能在堆上(栈上)生成对象的类?

發布時間:2024/10/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/Cpp / 如何定义一个只能在堆上(栈上)生成对象的类? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在 C++ 中,類的對象建立分為兩種,一種是靜態建立,如 A a;另一種是動態建立,如 A* ptr = new A;這兩種方式是有區別的。

靜態建立一個類對象,是由編譯器為對象在棧空間中分配內存,是通過直接移動棧頂指針,挪出適當的空間,然后在這片內存空間上調用構造函數形成一個棧對象。使用這種方法,直接調用類的構造函數。

動態建立類對象,是使用 new 運算符將對象建立在堆空間中。這個過程分為兩步,第一步是執行 operator new() 函數,在堆空間中搜索合適的內存并進行分配;第二步是調用構造函數構造對象,初始化這片內存空間。這種方法,間接調用類的構造函數。

? ? ? ? 那么如何限制類對象只能在堆或者棧上建立呢?下面分別進行討論。

1、只能建立在堆上

類對象只能建立在堆上,就是不能靜態建立類對象,即不能直接調用類的構造函數。

容易想到將構造函數設為私有。在構造函數私有之后,無法在類外部調用構造函數來構造類對象,只能使用 new 運算符來建立對象。然而,前面已經說過,new 運算符的執行過程分為兩步,C++提供 new運算符的重載,其實是只允許重載 operator new() 函數,而 operator() 函數用于分配內存,無法提供構造功能。因此,這種方法不可以。

當對象建立在棧上面時,是由編譯器分配內存空間的,調用構造函數來構造棧對象。當對象使用完后,編譯器會調用析構函數來釋放棧對象所占的空間。編譯器管理了對象的整個生命周期。如果編譯器無法調用類的析構函數,情況會是怎樣的呢?比如,類的析構函數是私有的,編譯器無法調用析構函數來釋放內存。所以,編譯器在為類對象分配棧空間時,會先檢查類的析構函數的訪問性,其實不光是析構函數,只要是非靜態的函數,編譯器都會進行檢查。如果類的析構函數是私有的,則編譯器不會在棧空間上為類對象分配內存。

? ? ? ? 因此,將析構函數設為私有,類對象就無法建立在棧上了。代碼如下:

class A { public : A(){} void destory(){ delete this ;} private : ~A(){} };

試著使用 A a; 來建立對象,編譯報錯,提示析構函數無法訪問。這樣就只能使用 new 操作符來建立對象,構造函數是公有的,可以直接調用。類中必須提供一個 destory 函數,來進行內存空間的釋放。類對象使用完成后,必須調用 destory 函數。

上述方法的一個缺點就是,無法解決繼承問題。如果 A 作為其它類的基類,則析構函數通常要設為 virtual,然后在子類重寫,以實現多態。因此析構函數不能設為 private。還好 C++ 提供了第三種訪問控制,protected。將析構函數設為 protected 可以有效解決這個問題,類外無法訪問protected成員,子類則可以訪問。

另一個問題是,類的使用很不方便,使用 new 建立對象,卻使用 destory 函數釋放對象,而不是使用 delete。(使用delete會報錯,因為 delete 對象的指針,會調用對象的析構函數,而析構函數類外不可訪問)這種使用方式比較怪異。為了統一,可以將構造函數設為 protected,然后提供一個 public 的 static 函數來完成構造,這樣不使用 new,而是使用一個函數來構造,使用一個函數來析構。代碼如下,類似于單例模式:

class A { protected : A(){} ~A(){} public : static A* create() { return new A(); } void destory() { delete this ; } };

? ? ? ? 這樣,調用 create() 函數在堆上創建類 A 對象,調用 destory() 函數釋放內存。

2、只能建立在棧上

只有使用 new 運算符,對象才會建立在堆上,因此,只要禁用 new 運算符就可以實現類對象只能建立在棧上。將 operator new() 設為私有即可。代碼如下:

class A { private : void * operator new ( size_t t){} // 注意函數的第一個參數和返回值都是固定的。 void operator delete ( void * ptr){} // 重載了 new 就需要重載 delete 。public : A(){} ~A(){} };

?

鏈接:https://www.nowcoder.com/questionTerminal/0a584aa13f804f3ea72b442a065a7618
來源:牛客網?

?

(SAW:Game Over!)

總結

以上是生活随笔為你收集整理的C/Cpp / 如何定义一个只能在堆上(栈上)生成对象的类?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 香蕉国产在线观看 | 亚洲成人激情小说 | 午夜一区二区三区免费 | 美女露隐私网站 | 大度亲吻原声视频在线观看 | 日本免费一区二区视频 | 小说肉肉视频 | 日韩av看片| 操操操插插插 | 在线观看欧美日韩视频 | 成人午夜精品无码区 | 国产在线18 | 久久久久久久网 | 福利在线视频观看 | 男女羞羞的视频 | 操碰97| 日本成人免费观看 | 欧美日韩国产一区在线 | 激情小说在线 | 131mm少妇做爰视频 | 欧美一区二区网站 | 国产精品1234区 | 漂亮人妻被黑人久久精品 | 一区二区三区日韩欧美 | 午夜在线影院 | 在线只有精品 | 欧美另类人妖 | 欧美 日韩 国产一区 | 精品欧美激情精品一区 | 日韩激情久久 | 少妇在线 | 夜夜嗨视频| 日韩丰满少妇无码内射 | 91网站观看 | 国产成人无码精品久在线观看 | 国产美女久久久久 | 欧美激情国产一区 | 亚洲福利视频导航 | 久久久国产精品人人片 | 亚洲成a人片在线 | 欧美精品黄 | av在线资源观看 | 中国精品毛片 | 亚洲精品乱码久久久久久写真 | 久久久午夜精品福利内容 | 久久网站av | 好男人www日本 | 国产污污网站 | www.在线看| 成人无码精品1区2区3区免费看 | 欧美七区| 秋葵视频成人 | 国产一区二区三区四区在线观看 | 麻豆av网址 | 亚洲成人一区在线 | 日本打白嫩屁股视频 | 理论片大全免费理伦片 | 亚洲色图视频网站 | 奇米色影视| 校园春色av | 香蕉久久影院 | 九色91| 婷婷丁香一区二区三区 | 999国产视频 | 又欲又污又肉又黄短文 | 伊人手机视频 | 大地资源二中文在线影视观看 | 日韩性xxxx | 香蕉久久av一区二区三区 | 性――交――性――乱 | 五月婷婷国产 | www.日韩视频 | 久青草国产在线 | 波多野42部无码喷潮在线 | 欧美日韩中日 | 欧美久久久久久久久久久久久久 | 波多野结衣毛片 | 尤物视频在线观看 | 免费网站黄色 | 国产suv精品一区 | 精品国产aⅴ麻豆 | 麻豆免费av| 精彩视频一区二区三区 | 69看片 | 国产调教打屁股xxxx网站 | 亚洲午夜伦理 | 插吧插吧综合网 | 亚洲自拍偷拍区 | 国产后入清纯学生妹 | 国产性一乱一性一伧一色 | 国产精品亚洲综合 | 日日噜噜噜夜夜爽爽狠狠视频97 | 成年人网站免费 | 青青青免费视频观看在线 | 涩涩97| 在线观看1区 | 中文字幕有码无码人妻av蜜桃 | 成人av第一页 | 毛片免费在线观看视频 |