C++中如何設計一個類只能在堆或者棧上創建對象,面試題


設計一個類,該類只能在堆上創建對象

  • 將類的構造函數私有,拷貝構造聲明成私有。防止別人調用拷貝在棧上生成對象。
  • 提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建

注意

  1. 在堆和棧上創建對象都會調用構造函數,為了防止在棧上創建對象我們將構造函數私有化。
  2. 拷貝構造函數是在棧上創建對象。
 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. 在堆和棧上創建對象都會調用構造函數,為了防止在堆上創建對象,應該將構造函數私有化。
 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來釋放空間的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM