設計一個類,該類只能在堆上創建對象
- 將類的構造函數私有,拷貝構造聲明成私有。防止別人調用拷貝在棧上生成對象。
- 提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建
注意
- 在堆和棧上創建對象都會調用構造函數,為了防止在棧上創建對象我們將構造函數私有化。
- 拷貝構造函數是在棧上創建對象。
1 class HeapOnly 2 { 3 public: 4 static HeapOnly* CreateObject() 5 { 6 return new HeapOnly;//這使得創建該類對象都只能通過new,確保了該類只能在堆上創建對象 7 } 8 9 private: 10 HeapOnly(){}//在堆和棧上創建對象都會調用構造函數,為了防止在棧上創建對象我們將構造函數私有化 11 HeapOnly(const HeapOnly&) = delete;//拷貝構造函數是在棧上創建對象 12 };
設計一個類,該類只能在棧上創建對象
方法一:
- 將類的構造函數私有。防止在堆上創建對象
- 提供一個靜態的成員函數,在該靜態成員函數中完成棧對象的創建
注意
- 在堆和棧上創建對象都會調用構造函數,為了防止在堆上創建對象,應該將構造函數私有化。
1 class StackOnly 2 { 3 public: 4 static StackOnly CreateObject() 5 { 6 return StackOnly();//確保了該類創建對象時不會使用new操作符,從而使得該類只能在棧上創建對象 7 } 8 private: 9 StackOnly(){}//在堆和棧上創建對象都會調用構造函數,為了防止在堆上創建對象,應該將構造函數私有化 10 };
方法二 只能在棧上創建對象,即不能在堆上創建,因此只要將new的功能屏蔽掉即可,即屏蔽掉operator new和定位new表達式,注意:屏蔽了operator new,實際也將定位new屏蔽掉。
1 class StackOnly 2 { 3 public: 4 StackOnly() {} 5 private: 6 void* operator new(size_t size); 7 void operator delete(void* p); 8 };
注意
- new和delete是用戶進行動態內存申請和釋放的操作符,operator new 和operator delete是系統提供的全局函數,new在底層調用operator new全局函數來申請空間,delete在底層通過operator delete全局函數來釋放空間。
- operator new函數實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間失敗,嘗試 執行空間不足應對措施,如果改應對措施用戶設置了,則繼續申請,否則拋異常。
- operator delete函數最終是通過free來釋放空間的