建立物件通常有兩種方法,如下:
第一種方式是靜態建立,第二種方式是動態建立。
aa;
a *p=new a
;
1、靜態建立類物件:是由編譯器為物件在棧空間中分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件。使用這種方法,直接呼叫類的建構函式。
2、動態建立類物件,是使用new運算子將物件建立在堆空間中。這個過程分為兩步,第一步是執行operator new()函式,在堆空間中搜尋合適的記憶體並進行分配;第二步是呼叫建構函式構造物件,初始化這片記憶體空間。這種方法,間接呼叫類的建構函式。
1、只能在堆上分配類物件
容易想到將建構函式設為私有。在建構函式私有之後,無法在類外部呼叫建構函式來構造類物件,只能使用new運算子來建立物件。然而,前面已經說過,new運算子的執行過程分為兩步,c++提供new運算子的過載,其實是只允許過載operator new()函式,而operatornew()函式只用於分配記憶體,無法提供構造功能。因此,這種方法不可以。
當物件建立在棧上面時,是由編譯器分配記憶體空間的,呼叫建構函式來構造棧物件。當物件使用完後,編譯器會呼叫析構函式來釋放棧物件所佔的空間。編譯器管理了物件的整個生命週期。如果編譯器無法呼叫類的析構函式,情況會是怎樣的呢?比如,類的析構函式是私有的,編譯器無法呼叫析構函式來釋放記憶體。所以,編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,其實不光是析構函式,只要是非靜態的函式,編譯器都會進行檢查。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。因此,將析構函式設為私有,類物件就無法建立在棧上了。
這時還要宣告乙個公有的銷毀方法,否則建立的物件將無法銷毀。
2、只能在棧上分配類物件
只有使用new運算子,物件才會建立在堆上,因此,只要禁用new運算子就可以實現類物件只能建立在棧上。雖然你不能影響new operator的能力(因為那是c++語言內建的),但是你可以利用乙個事實:new operator 總是先呼叫 operator new,而後者我們是可以自行宣告重寫的。因此,將operator new()設為私有即可禁止物件被new在堆上。
結論
限制物件在堆中建立,private或protected析構函式
限制物件在棧中建立,private或protected
new operator及new operator
如何只在堆或者棧上分配類物件
2015 08 13 13 42 315人閱讀收藏 舉報 c c 61 昨天乙個同學去網易面試c 研發,問到了這麼乙個問題 如何限制乙個類物件只在棧 堆 上分配空間?一般情況下,編寫乙個類,是可以在棧或者堆分配空間。但有些時候,你想編寫乙個只能在棧或者只能在堆上面分配空間的類。這能不能實現呢?仔細想...
設計只能在堆或者棧上建立的類
看到了csdn一篇帖子在討論這個問題,某牛給出了回答,於是加以整理了一下 設計只能在堆上分配的類 方法 將類的建構函式或者析構函式設定為私有,迫使類物件在棧的構造時編譯出錯 include using namespace std class onlyheap 設計只能在棧上分配的類 過載new和de...
設計乙個類,只能在棧上建立物件
設計乙個類,只能在棧上建立物件 思考的幾個要點 1 只能在棧,說明不能在堆上建立,考慮堆上建立物件的兩種方法 new和定位new表示式,原理 先呼叫operator new開空間,然後執行建構函式 所以遮蔽掉operator new 即放成私有 這樣就排斥了直接new和定位new表示式 注意 上面的...