1. 只在堆中建立
編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。因此,將析構函式設為私有,類物件就無法建立在棧上了。這樣就只能使用new操作符來建立物件,建構函式是公有的,可以直接呼叫。類中必須提供乙個destory函式,來進行記憶體空間的釋放。類物件使用完成後,必須呼叫destory函式。
class
person
void
test()
void
destroy()
private:~
person()
private
:int age;
string name;};
intmain()
也可以將建構函式,析構函式都設為private或protected,然後提供乙個public的static函式來完成構造,這樣不使用new,而是使用乙個函式來構造,使用乙個函式來析構。
**如下,類似於單例模式:
classa~
a()public
:static a*
create()
void
destory()
};
2. 只在棧中建立
如果想讓物件只能在棧上,那就是不能讓別人使用到new這個操作符。可以在class中過載了私有的成員函式new,而且delete也需要一起過載下。如下面的例子:
class
a// 注意函式的第乙個引數和返回值都是固定的
void
operator
delete
(void
* ptr)
// 過載了new就需要過載delete
public:a
()~a
()};
如何限制乙個類物件只在堆上分配或者只在棧上分配?
1.第一種說法 只在棧上 class stackonly 只在堆上 class heaponly heaponly 前者利用了c 的過載機制 訪問控制機制。後者利用了c 的訪問控制機制。前者過載了new運算子,並設為私有,因此,當用 new stackonly 時編譯器就會報錯。後者則將建構函式設為...
C 設計乙個類,只能在棧 堆 上建立物件
設計乙個類,只能在棧上建立物件 使用new運算子,物件會建立在堆上,也就是說只要不用new去建立物件就可以實現,我們知道new和delete分別呼叫了operator new和operator delete,如果我們把這兩個函式宣告為私有的,操作符new就不能用了。class a a private...
如何讓類物件只在棧(堆)上分配空間?
一般情況下,編寫乙個類,是可以在棧或者堆分配空間。但有些時候,你想編寫乙個只能在棧或者只能在堆上面分配空間的類。這能不能實現呢?仔細想想,其實也是可以滴。在c 中,類的物件建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如a ptr new a 這兩種方式是有區別的。1 靜態建立類物件 是...