只能在堆內存上實例化的類:將析構函數定義為private,在棧上不能自動調用析構函數,只能手動調用。也可以將構造函數定義為private,但這樣需要手動寫一個函數實現對象的構造。
網站建設哪家好,找成都創新互聯!專注于網頁設計、網站建設、微信開發、微信小程序定制開發、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了桂平免費建站歡迎大家使用!
只能在棧內存上實例化的類:將函數operator new和operator delete定義為private,這樣使用new操作符創建對象時候,無法調用operator new,delete銷毀對象也無法調用operator delete。
#include <iostream> using namespace std; //只能在堆內存上實例化的類 class CHeapOnly { public: CHeapOnly() { cout << "Constructor of CHeapOnly!" << endl; } void Destroy() const { delete this; } private: ~CHeapOnly() { cout << "Destructor of CHeapOnly!" << endl; } }; //只能在棧內存上實例化的類,就是不能使用new來構造類,把operator new私有化 class CStackOnly { public: CStackOnly() { cout << "Constructor of CStackOnly!" << endl; } ~CStackOnly() { cout << "Destrucotr of CStackOnly!" << endl; } private: void* operator new(size_t size) { } void operator delete(void * ptr) { } }; int main() { CHeapOnly* pHeap = new CHeapOnly; pHeap->Destroy(); CStackOnly objStack; return 0; } //只能在堆內存上實例化的類 // 下面一個類也只能在堆內存上生成,將構造函數和析構函數都定義為private, //但是可以通過類的static函數創建對象,不過這個對象是不能被繼承的。 class FinalClass { public: static FinalClass* GetInstance() { cout << "Constructor of the class" << endl; return new FinalClass; } static void DeleteInstance(FinalClass* pInstance) { cout << "Destructor of the class" << endl; delete pInstance; pInstance = 0; } private: FinalClass() {} ~FinalClass() {} }; int main() { FinalClass* fc = FinalClass::GetInstance(); FinalClass::DeleteInstance(fc); return 0; }
新聞名稱:設計一個只能在堆內存上實例化的類和一個只能在棧內存上實例化的類
當前地址:http://m.newbst.com/article14/ijsege.html
成都網站建設公司_創新互聯,為您提供靜態網站、網站內鏈、自適應網站、用戶體驗、定制開發、網頁設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯