C 中物件建立的兩種方式

2022-05-01 21:54:14 字數 1093 閱讀 1508

在c++中,類的物件建立分為兩種,一種是靜態建立,如a a;另一種是動態建立,如a* ptr=new a;這兩種方式是有區別的。

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

動態建立類物件,是使用new運算子將物件建立在堆空間中。這個過程分為兩步,第一步是執行operator new()函式,在堆空間中搜尋合適的記憶體並進行分配;第二步是呼叫建構函式構造物件,初始化這片記憶體空間。這種方法,間接呼叫類的建構函式。

那麼如何限制類物件只能在堆或者棧上建立呢?下面分別進行討論。

1、只能建立在堆上

當物件建立在棧上面時,是由編譯器分配記憶體空間的,呼叫建構函式來構造棧物件。當物件使用完後,編譯器會呼叫析構函式來釋放棧物件所佔的空間。c++是靜態繫結語言,編譯器管理了物件的整個生命週期。如果,類的析構函式是私有的,編譯器無法呼叫析構函式來釋放記憶體。所以,編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。

因此,將析構函式設為私有,類物件就無法建立在棧上了。**如下:

class

a

void destory()

private

: ~a(){}

};

2、只能在棧上生成物件:將new 和 delete 過載為私有。

將new操作設定為私有,那麼第一階段就無法完成,就不能夠再堆上生成物件。

class

a //

注意函式的第乙個引數和返回值都是固定的

void

operator

delete ( void * ptr){} //

過載了new就需要過載delete

public

: a(){}

~a(){}

};

關於建立物件的兩種方式

填寫內容讓下面 支援a.name name1 b.name name2 function obj name obj.prototype.name name2 var a obj name1 var b new obj 關於本題有以下兩種答案 方法1 if name obj.name name1 re...

String建立物件的兩種方式

用string建立物件有兩種方式 第一種為直接賦值,string 物件名 字串 例如 string name tom 第二種為new構造方法,string 物件名 new string 字串 例如string name new string tom public class test 執行結果為tu...

執行緒建立的兩種方式

建立執行緒的兩種方式 1.繼承thread並重寫方法,在run方法中定義執行緒要執行的任務 class mythread extends thread public class threaddemo1 2.實現runable介面並重寫run方法 class myrunnable implements...