只能在堆上定義的物件可以通過宣告建構函式是私有的,然後提供兩個靜態的方法,乙個方法用來獲取堆上的物件,乙個用來釋放堆上的物件。c++中定義乙個不能被繼承的類中第二種方法就是通過這種方式宣告了乙個不能被繼承的類,但是這個類的物件就只能位於堆中了。
那麼如何一定乙個只能在棧上構造的物件?
這個就涉及到了c++中new這個操作符,它包含兩步:
呼叫乙個全域性的operator new函式分配一定的記憶體空間
呼叫物件的建構函式
如果不允許乙個類在堆上分配記憶體,但是允許其在棧上分配記憶體,對比這兩種方式可以發現只需要禁止第一步的操作即可,就是禁止乙個物件呼叫operator new函式。這可能就涉及到了operator new這個庫函式了,對於類,這個庫函式是可以被過載的,只需要將它過載成私有的即可。這是c++ reference中對operator new的說明。可以檢視這個鏈結中對operator new的說明即可。下面的函式原型就是從上面的文件中拷貝過來的。這裡甚至可以不寫實現。
#include #include using namespace std;
class a
執行輸出:
設計乙個類,只能在棧上建立物件
設計乙個類,只能在棧上建立物件 思考的幾個要點 1 只能在棧,說明不能在堆上建立,考慮堆上建立物件的兩種方法 new和定位new表示式,原理 先呼叫operator new開空間,然後執行建構函式 所以遮蔽掉operator new 即放成私有 這樣就排斥了直接new和定位new表示式 注意 上面的...
如何定義乙個只能在棧上(對上)建立物件的類
1 只能在堆上生成物件 將析構函式設定為私有。原因 c 是靜態繫結語言,編譯器管理棧上物件的生命週期,編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性。若析構函式不可訪問,則不能在棧上建立物件。2 只能在棧上生成物件 將new 和 delete 過載為私有。將new操作設定為私有,那麼第一...
如何定乙個只能在堆上或者只能在棧上定義的類
c 中,物件的建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如 a ptr new a 靜態建立 由編譯器為物件在棧上分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件,使用這種方法,直接呼叫類的建構函式 動態建立 是通過new運算子將物...