深入理解C 類的建構函式與析構函式

2021-07-14 21:52:02 字數 2462 閱讀 3187

在研究

c++類的繼承、派生、組合時,一直沒有清晰地了解建構函式與析構函式的呼叫過程。本章通過點

-線組合類,來深入分析組合類情況下,物件的構造與析構。

源**:

#include using namespace std;

#includeclass point

{private:

int x; int y;

public:

int getx();

int gety();

point()

{ cout<

程式執行結果:

point mypoint1;
該條語句是利用point類進行初始化point物件,此時,編譯器會自動呼叫程式的建構函式。由於物件定義不帶有任何引數,所以此時僅呼叫程式的預設建構函式。

輸出為「calling the default construction of point!」

point mypoint2(1,2);
語句定義乙個point類的物件,但是此時我們應該注意到對mypoint2物件進行了初始化,此時作業系統會呼叫含有引數的建構函式。

具體行為過程是,在記憶體中開闢空間定義臨時變數 int xx, int yy;通過引數傳遞,xx = 1. yy = 2;然後在執行含有引數建構函式的函式體,完成臨時變數值向point類的屬性x,y的賦值。

輸出「calling the parameter construction of point!」

point mypoint3(mypoint2);
語句仍然定義了乙個point類的物件,但是應該注意到,這裡利用了前乙個物件mypoint2對mypoint3進行初始化 。呼叫了point類複製建構函式。相當於&pt = mypoint2 。此時,通過看看記憶體位址,我們可以看到,編譯器並沒用定義乙個point類的物件臨時pt。而是採用了「引用」的模式,pt僅僅是mypoint2的乙個別名而已!!!

輸出「calling the copy construction of point!」

cout<
輸出當前point類的屬性x,y;輸出「 1 2」

point mypt1(1,2),mypt2(3,4);
定義point類的兩個帶有初始化引數的物件,

輸出「calling the parameter construction of point!」

"calling the parameter construction of point!"

line line1(mypt1,mypt2);
注意到,此時我們在嘗試利用引數傳遞的方式來構造line的物件line1,也就是說,相比較而言line是上一層的類,而mypt1/mypt2是底層類的物件。此時的程式執行過程可以分解為:

&pt = mypt2;  // 「calling the copy construction of point!」

&pt = mypt1; // "calling the copy construction of point!"

//注意到,此時仍然是引用的格式,沒有進行臨時物件的構建

line1(mypt1,mypt2); //「calling the parameter construction of line!」

重點

「calling the destructor of point!」 //銷毀物件mypt1

「calling  the destructor of point!」 //銷毀物件mypt2

line line2(line1);
&l = line1; //引用傳遞

「calling the default construction of point!」

"calling the default construction of point!"

//執行line複製建構函式的函式體

「calling the copy construction of line」

退出程式後,對所有物件進行銷毀,其順序為「與構造函式呼叫順序相反」

C 類的建構函式與析構函式

前言序錦 很開深也很受教的一次c 學習,今天在圖書館自習,女票說要拿一道c 的題來考考我,說這道題頗有難度,當時的我是很激動的,畢竟作為程式猿來說,就相當於獵人嗅到了食物的味道一樣o o哈哈 好了話不多說,直接來上題目吧 正文 題目 calss a a a p 老鐵們,請先不要繼續往下看,先來自己品...

C 建構函式深入理解

01 初始化引數列表.cpp include include include using namespace std struct student 拷貝建構函式定義 拷貝建構函式的有效引數,必須是該類的物件的引用 if 1 student student s,int class no 1 else ...

類的建構函式與析構

1.把物件的初始化工作放在建構函式中,把清除工作放在析構函式中。當物件被建立時,建構函式被自動執行。當物件消亡時,析構函式被自動執行。這下就不用擔心忘了物件的初始化和清除工作。2.建構函式 析構函式與類同名,由於析構函式的目的與建構函式的相反,就加字首 以示區別。3.建構函式與析構函式都沒有返回值型...