學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,字元型別被初始化為...