c 建構函式的背後

2021-03-31 22:19:00 字數 2908 閱讀 4518

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++建構函式背後做的事我們也可以有乙個比較清晰的認識了吧!

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...

C 的建構函式

tags c 建構函式是用於建立物件的特殊成員函式,當建立物件時,系統自動呼叫建構函式建構函式的作用是 為物件分配空間 對資料成員賦初值 請求其他資源 沒有使用者定義的建構函式時,系統提供預設版本的建構函式 建構函式名與類名相同 類名 建構函式可以過載,建構函式可以有任意型別的引數,但沒有返回型別。...

C 的建構函式

1 定義 在基於物件的程式中,在定義乙個物件時,也需要作初始化的工作,即對資料成員賦初值。因為不能再類宣告中對資料成員初始化 類並不是乙個實體,而是乙個抽象型別,並不占用儲存空間,顯然無法容納資料 c 提供了建構函式來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來...