c 3 5子物件和堆物件

2021-10-25 19:34:19 字數 2852 閱讀 8876

乙個物件作為另乙個類的成員時,該物件稱為類的子物件。子物件實際是某個類的資料成員。

為初始化子物件,x的建構函式要呼叫這些物件成員所在類的建構函式,於是x類的建構函式中就應包含資料成員初始化列表,用來給子物件初始化。

成員初始化列表中的選項可以是對子物件進行初始化的,也可以是對該類其他資料成員初始化的,其中的參數列給出為呼叫相應成員所在類的建構函式時應提供的引數。

對子物件的建構函式的呼叫順序取決於這些子物件在類中說明的順序(與它們在成員初始化列表中給出的順序無關)

當建立x類的物件時,先呼叫子物件的建構函式,初始化子物件,然後才執行x類的建構函式,初始化x類中的其他成員。

析構函式的呼叫順序與建構函式相反。

來個例子。(前面的概念感覺乾巴巴的,還記不住)

#include

using

namespace std;

class

part

;part::part (

)//預設建構函式

part::

part

(int x)

part::

~part (

)class

whole;~

whole()

;private

: part p1;

//對子物件的建構函式的呼叫順序起決定作用

part p2;};

whole::whole (

int i):p1

(),p2

(i)//對子物件初始化,與子物件的構造函式呼叫順序無關

whole::

~whole (

)int

main()

結果:

default constructor of part

constructor of part,

3constructor of whole

constructor of whole

destructor of part,

3destructor of part,

0

whole類的預設建構函式沒有給出成員初始化列表,這表明子物件將使用預設建構函式進行初始化。

int

main()

結果:

default constructor of part

default constructor of part

constructor of whole

destructor of part,

0destructor of part,

0

如果whole類中還有其他資料成員,其初始化也可通過成員初始化列表進行

class

whole;~

whole()

;private

: part p1;

part p2;

int data;};

//為了初始化資料成員data,這時該建構函式也可以定義成如下格式

whole::

whole

(int i,j):p1

(),p2

(i),

data

(j)

堆物件是在程式執行時根據需要隨時可以被建立或刪除的物件。

在虛擬的程式空間中存在一些空閒儲存單元,這些空閒儲存單元組成的所謂的堆。

建立或刪除堆物件分別使用new和delete

使用語法

new《型別說明符》《初始值列表》
new 的返回值是乙個指標,使用該運算子給某物件分配乙個位址值,由《型別說明符》來給定物件的型別。

在使用該運算子建立物件時,系統自動呼叫該類的建構函式,並根據《初始值列表》中的初始值的個數來選擇對應引數個數的建構函式。

舉個例子:

heapobjectclass *pa;

pa=new

heapobjectclass(3

,7);

pa是乙個指向類heapobjectclass的物件指標,new建立乙個類heapobjectclass的物件,將它的位址值賦給pa,並對該物件進行初始化,呼叫具有兩個引數的建構函式,初始值為3和7.

它是專門用來釋放new所建立的物件的。

語法:

delete

《指標名》

因為堆是有限的,如果堆中沒有足夠的自由空間以滿足記憶體的需要時,那麼此需要失敗,並且new返回乙個空指標。因此,必須在使用new生成的指標之前進行檢查。

來,舉個例子吧

int

main()

cout<<

"exit main"

delete pa2;

return0;

}

new《型別說明符》[《算數表示式》]

比如:

objectclass *ptr;

ptr=

new objectclass[15]

;

該陣列的每個元素都是objectclass的物件,ptr是指向物件陣列首元素的指標

delete[ ]指標名

比如:

delete

ptr;

注意啊

堆空間給程式執行帶來了極大的自由度。

但是管理堆區是一件十分複雜的工作,頻繁的分配和釋放不同大小的堆空間將會產生堆內碎塊。(額,為啥會產生呢?)

使用堆空間往往是由於:

以上內容全部出自教材啊

棧物件和堆物件

在gameres上看見乙個問題帖 什麼時候該用 object object 什麼時候該用 object object object new object 感覺看起來沒什麼區別,其實不一樣 前乙個是棧物件,後乙個是堆物件。引用一下別人對棧物件 堆物件的解釋 棧物件的優勢是在適當的時候自動生成,又在適當...

C 棧物件 堆物件 理解

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

c 中堆物件與棧物件

使用棧物件的意外收穫 棧物件是在適當的時候建立,然後在適當的時候自動釋放的,也就是棧物件有自動管理功能。那麼棧物件會在什麼會自動釋放了?第一,在其生命期結束的時候 第二,在其所在的函式發生異常的時候。你也許說,這些都很正常啊,沒什麼大不了的。是的,沒什麼大不了的。但是只要我們再深入一點點,也許就有意...