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 提供了建構函式來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來...