如何限制類的物件只能在堆上建立? 如何限制僅在堆疊上建立物件?
注意:在 C++ 中為類建立物件有兩種型別:靜態建立,動態建立
靜態建立:編譯器在堆疊空間上為物件分配記憶體,並直接呼叫類的建構函式來建立物件。 例如:a a;
動態建立:使用 new 關鍵字在堆空間上建立乙個物件,底層首先呼叫運算元 new() 函式在堆空間上找到合適的記憶體並分配; 然後,呼叫類的建構函式來建立物件。 例如:a *p = new a();
受限制的物件只能在堆上生成:
最直觀的想法:避免直接呼叫類的建構函式,因為當物件是靜態建立的時,會呼叫類的建構函式來建立物件。 但是,將類的建構函式設為私有是不可行的,因為當建構函式設定為私有時,不能在類外部呼叫建構函式來構造物件,只能新呼叫建構函式來構造物件。 但是,由於在建立物件時,類的建構函式也是在 new 的底部呼叫的,因此在將建構函式設定為 private 之後,無法使用 new 在類之外建立物件。 因此,這種方法是不可行的。 解決方法 1:
將析構函式設定為私有。原因:靜態物件建立在堆疊上,編譯器分配和釋放記憶體空間,編譯器為物件分配記憶體空間時,檢查類的非靜態函式,即編譯器檢查析構函式的可訪問性。 當析構函式設定為 private 時,編譯器建立的物件無法訪問析構函式來釋放物件的記憶體空間,因此編譯器不會為堆疊上的物件分配記憶體。
class a void destory() private: ~a()該方法的問題:
使用 new 建立的物件通常使用 delete 來釋放物件的記憶體空間,但析構函式不能從類外部呼叫,因此必須在類中定義乙個 destory() 函式來釋放由 new 建立的物件。 沒有辦法解決繼承問題,因為如果將類用作基類,則將析構函式設定為虛擬,然後在派生類中重寫函式以實現多型性。 但是在這一點上,析構函式是私有的,在派生類中不可訪問。 解決方法 2:
將建構函式設定為 protected,並提供 public 的靜態函式來完成構造,而不是在類外部使用新構造; 將析構函式設定為 protected。 原因:與單一例項模式類似,析構函式保證在派生類中可訪問。 通過呼叫 create() 函式在堆上建立乙個物件。
class a ~a() public: static a *create() void destory()受限制的物件只能在堆疊上構建:
解決辦法:將運算子 new() 設定為 private。 原因:當乙個物件在堆上構建時,它是以一種新的方式建立的,底層會呼叫運算子 new() 函式,所以只要函式受到限制,就可以阻止該物件在堆上構建。
類 a 注意函式的第乙個引數和返回值是固定的: void operator delete(void *ptr) { 如果過載 new,則需要過載 delete public: a() a()。