os
:winxp
、平台:
i386
* 以下是測試**
* class obj
*/class obj
void funca()
void funcb()
virtual void vfunc()
~obj()
};/* main */
int main(int arg , char *argv)
int n = 2 ;
obj *po = new obj(&n);
cout<<"***after construt***" 1.初始化過程: 我們知道類的物件初始化需要呼叫類的建構函式。那麼這個過程是怎麼樣的呢?我們先來看看物件的初始化過程。 (一) obj *po =new obj(&n) ; 對應彙編: 00401c 23 0f bf 0d 5c 55 41 00 movsx ecx,word ptr [`main'::`2'::__line__var ( 0041555c )] 00401c 2a83 c 1 11addecx,11h 00401c 2d 51pushecx 00401c 2e 68 20 55 41 00 pushoffset this_file (00415520) 00401c 33 6a 0c push0ch 00401c 35 e8 80 fb ff ffcalloperator new (004017ba) /*1呼叫 operator new (new 操作符)分配了 sizeof(obj) 大小的記憶體空間。 */00401c 3a83 c 4 0c addesp,0ch 00401c 3d 89 45 e0movdword ptr [ebp-20h],eax /*2.eax 中儲存了返回的記憶體起始位址指標,此處把起始位址指標儲存在 [ebp-20h] 中。現在我們記住 eax的值,我這裡是 0x00421110, 後面有用 */00401c 40 c 7 45 fc 00 00 00 00 movdword ptr [ebp-4],0 00401c 47 83 7d e0 00cmpdword ptr [ebp-20h],0 /*3 這裡判斷分配的位址是否為空,和我們通常在分配完記憶體後所作的判斷一樣 */00401c 4b 74 11 jemain+12eh ( 00401c 5e) 00401c 4d 8d 55 ecleaedx,[n] 00401c 50 52pushedx /*obj 的建構函式的引數入棧,為呼叫建構函式作準備*/ 00401c 51 8b 4d e0movecx,dword ptr [ebp-20h] /*引數儲存在暫存器 cx*/ 00401c 54 e8 d 4 f 3 ff ffcall@ilt+40(obj::obj) (0040102d) /*呵呵,開始了。進入 obj建構函式的呼叫*/ 我們仍然來看能給我們提示的關鍵語句: (二)printf("this point to %x/n" , (unsigned int)this ); 00401a 91 8b f4movesi,esp 00401a 93 8b 55 fcmovedx,dword ptr [ebp-4] 00401a 96 52pushedx 00401a 97 68 6c 41 41 00pushoffset string "this point to %x/n" ( 0041416c )/*按函式呼叫方式 __cdecl ,引數(unsigned int) (this )先入棧,在我這裡,從 memory 中可以看到 ebp-4 = 12fee4 ,[ebp-4] = 421110 , 這就是前面通過 operator new 分配的記憶體首址,也就是說 obj *po此時 指向的位址。在 obj的建構函式裡, obj *po 完成一系列的初始化工作。*/ 00401a 9cff 15 d4 62 41 00calldword ptr [__imp__printf (004162d4)] 00401aa2 83 c 4 08addesp,8 00401aa5 3b f4cmpesi,esp 00401aa7 e8 26 fd ff ffcall_chkesp (004017d2) 從以上分析我們可以看出,obj *po首先由 operator new分配記憶體位址 ,然後以記憶體位址作為引數呼叫obj建構函式,也就是說在呼叫建構函式以前,物件的記憶體布局就已經完成.基本上我們的分析到這裡就可以結束了.對於c++建構函式背後做的事我們也可以有乙個比較清晰的認識了吧! 建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13... tags c 建構函式是用於建立物件的特殊成員函式,當建立物件時,系統自動呼叫建構函式建構函式的作用是 為物件分配空間 對資料成員賦初值 請求其他資源 沒有使用者定義的建構函式時,系統提供預設版本的建構函式 建構函式名與類名相同 類名 建構函式可以過載,建構函式可以有任意型別的引數,但沒有返回型別。... 1 定義 在基於物件的程式中,在定義乙個物件時,也需要作初始化的工作,即對資料成員賦初值。因為不能再類宣告中對資料成員初始化 類並不是乙個實體,而是乙個抽象型別,並不占用儲存空間,顯然無法容納資料 c 提供了建構函式來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來...C 建構函式 拷貝建構函式
C 的建構函式
C 的建構函式