限制乙個類物件只在棧(堆)上建立

2021-10-07 15:48:26 字數 1046 閱讀 2429

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 靜態建立類物件 是...