設計乙個只能在堆上或棧上的類

2021-07-30 23:00:46 字數 1215 閱讀 1660

一道c++筆試題:設計乙個只能在堆記憶體上例項化的類和乙個只能在棧記憶體上例項化的類

只能在堆記憶體上例項化的類:將析構函式定義為private,在棧上不能自動呼叫析構函式,只能手動呼叫。也可以將建構函式定義為private,但這樣需要手動寫乙個函式實現物件的構造。

只能在棧記憶體上例項化的類:將函式operator new和operator delete定義為private,這樣使用new操作符建立物件時候,無法呼叫operator new,delete銷毀物件也無法呼叫operator delete。

#include

using namespace std;

//只能在堆記憶體上例項化的類

class cheaponly

void destroy() const

private:

~cheaponly()

};//只能在棧記憶體上例項化的類,就是不能使用new來構造類,把operator new私有化

operator new 函式用來為物件分配原始記憶體。new 操作符的第一步呼叫的就是operator new 。你可以過載這個函式。它的原型如下:

void* operator new(size_t size);

函式的返回值是void*, 因為這個函式返回的是指標。這個指標指向原生的,為初始化的記憶體。其語義就像malloc 。實際上它內部呼叫的就是malloc 。引數size 指定待分配的記憶體大小。你可以在過載的時候加上額外的引數,但是第乙個引數型別必須是size_t.

class cstackonly

~cstackonly()

private:

void* operator new(size_t size)

void operator delete(void * ptr)

};int main()

下面乙個類也只能在堆記憶體上生成,將建構函式和析構函式都定義為private,但是可以通過類的static函式建立物件,不過這個物件是不能被繼承的。

#include

using namespace std;

//只能在堆記憶體上例項化的類

class finalclass

static void deleteinstance(finalclass* pinstance)

private :

finalclass() {}

~finalclass() {}

};int main()

設計乙個只能在堆上或棧上例項化的類

一道c 筆試題 設計乙個只能在堆記憶體上例項化的類和乙個只能在棧記憶體上例項化的類 只能在堆記憶體上例項化的類 將析構函式定義為private,在棧上不能自動呼叫析構函式,只能手動呼叫。也可以將建構函式定義為private,但這樣需要手動寫乙個函式實現物件的構造。只能在棧記憶體上例項化的類 將函式o...

C 限制乙個類只能在堆上或棧上分配

方法一 只在棧上class stackonly 只在堆上class heaponly heaponly 前者將過載new運算子並限制為私有,後者將建構函式私有。方法二 只在堆上分配 將類的建構函式屬性置為private,同時提供static成員函式getinstance,在函式中new乙個新物件,然...

如何定乙個只能在堆上或者只能在棧上定義的類

c 中,物件的建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如 a ptr new a 靜態建立 由編譯器為物件在棧上分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件,使用這種方法,直接呼叫類的建構函式 動態建立 是通過new運算子將物...