在研究
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.建構函式與析構函式都沒有返回值型...