1. 只能在堆上
即禁止在棧上生成。如何實現?
當物件建立在棧上面時,是由編譯器分配記憶體空間的,呼叫建構函式來構造棧物件。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。
所以,只需把類的析構函式宣告為private即可禁止該類在棧上生成物件。但是別忘了提供乙個public的函式用於析構。
1classa 4
void
destroy()
7private
:8 ~a(){}
9 };
缺點&follow up:
2. 只能在棧上
即禁止在堆上生成。
只有使用new運算子,物件才會建立在堆上。因此,只要禁用new運算子就可以實現類物件只能建立在棧上。因此將運算子new和delete設為private即可。
1class
a 4 ~a(){}
5private:6
void* operator
new(size_t size) {} //void*
7void operator
delete(void*ptr) {} //void
8 };
注意:new運算子的返回值型別是void* , delete的返回值型別是void。別弄錯了。
另外,new的引數是size_t, delete的引數是void*.
ref1:
ref2:
怎麼讓類只能在堆上生成例項
今天遇到乙個很有意思的面試題 面試官 怎麼讓類只能在堆上生成例項?我 把析構函式設為私有 原因如下 編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,其實不光是析構函式,只要是非靜態的函式,編譯器都會進行檢查。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。當然,之後必...
只能在棧上或者堆上建立的物件
今天在這裡面看到了這個題目,據說還是google面試題。總的思想,是把一些在棧上或者堆上面建立物件,所必須的函式設為private使得編譯報錯。比如 只能在堆上建立,不能在棧上建立。因為棧上的物件,總是要呼叫析構函式。所以把析構函式設為private,然後new出來的物件,顯式的呼叫delete就可...
如何定乙個只能在堆上或者只能在棧上定義的類
c 中,物件的建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如 a ptr new a 靜態建立 由編譯器為物件在棧上分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件,使用這種方法,直接呼叫類的建構函式 動態建立 是通過new運算子將物...