對C 建構函式的認識

2021-04-13 13:41:55 字數 1217 閱讀 9620

學c++已經有一段時間了,但是對一些東西的理解任然停留在書本上,沒有更深刻的認識。比如如題。

曾有人問過我建構函式的作用是幹什麼的?回答很簡單:「用來構造物件的」。於是滿腦子就形成了這樣

一種認識:乙個物件只有在呼叫了建構函式以後,它所對應的記憶體塊才有效。此思想存在了相當長的時間,

可以說直到寫這篇文章前夕。我們在寫建構函式時,如果建構函式形參和類成員變數同名,我們會用this

指標來加以區分。這從某種程度上已經暗示了呼叫建構函式時,類物件已經存在了。奈何思想頑固,對此

而不見。

下面從彙編的角度來說明,物件其實在呼叫建構函式之前就已經存在了。

#include

<

iostream

>

using

namespace

std;

class

aintmain( )

...

在主函式 a    gg;插入斷點,執行,alt + 8  ,檢視底層的彙編**。

24:   a gg;

004038d8   lea         ecx,[ebp-8]

004038db   call        @ilt+720(a::a) (004012d5)

25:     return 0;

004038e0   mov         dword ptr [ebp-0ch],0

004038e7   lea         ecx,[ebp-8]

004038ea   call        @ilt+740(a::~a) (004012e9)

004038ef   mov         eax,dword ptr [ebp-0ch]

26:   }

首先對上面的彙編**做以下說明:

這是main函式中的一段**,  24  , 25   ,   26分別對應著主函式中的a   gg、return 0、  }

當除錯停在004038d8指令上時,我們檢視 &gg的值 為  0x0012ff78,說明物件已經存在了。

也就是說建構函式只是類物件第乙個呼叫的函式,而不是構造類物件記憶體塊的傢伙。

至於物件gg的析構是在 return 0;後呼叫的,注意看指令 004038ea  呼叫了類的析構函式,不過

掉了類的析構函式並不意味著物件對應的記憶體塊就無效了!物件gg對應的記憶體塊無效要等到 26以後。

這會在另一篇關於對析構函式的認識中說明。

對虛函式的認識

可以在繼承類中重寫父類的方法,關鍵字是virtual。如下 所示,父類是super,繼承類是sub,在sub中,重寫了super的go 方法。include using namespace std class super class sub public super int main 程式的執行結果...

對C 預設建構函式的理解

在文章開始之前,首先指出對於c 新手的兩個常見的誤解 一 任何class如果沒有定義default constructor,就會被合成出乙個來。二 編譯器合成出來的default constructor會明確設定 class內每乙個data member的預設值 首先我們來討論第乙個誤解。編譯器並不...

黑馬程式設計師 學習筆記 對建構函式的認識

windows phone 7手機開發 net培訓 期待與您交流!1,建構函式概念 建構函式是一種特殊的方法成員,建構函式的主要作用是是在建立物件時初始化物件。乙個類定義必須至少有乙個建構函式,如果定義類時,沒有宣告建構函式,系統會提供乙個預設的建構函式,如,數值型別被初始化為0,字元型別被初始化為...