構造函數的使用(一)

構造函數是C++類的重要組成部分,起着初始化對象的做用。當對象生成的時候,編譯器會自動調用對象的構造函數,完成對象的初始化工做。根據對象的不一樣做用域和聲明週期,能夠將對象分爲一下幾種:函數

1.局部對象this

2.堆對象spa

3.全局對象指針

4.靜態對象code

下面咱們將以反彙編(VC6.0)的形式,查看局部對象的調用時機對象

#include <stdio.h>

class CDemo
{
public:
    CDemo()
    {
        m_nInt = 100;
    }

private:
    int m_nInt;
};


int main(void)
{
    CDemo demo;     //建立一個局部對象


    return 0;
}

將以上代碼進行反彙編後以下blog

16:   int main(void)
17:   {
00401020 55                   push        ebp
00401021 8B EC                mov         ebp,esp
00401023 83 EC 44             sub         esp,44h
00401026 53                   push        ebx
00401027 56                   push        esi
00401028 57                   push        edi
00401029 8D 7D BC             lea         edi,[ebp-44h]
0040102C B9 11 00 00 00       mov         ecx,11h
00401031 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401036 F3 AB                rep stos    dword ptr [edi]
18:       CDemo demo;          //建立一個局部對象
00401038 8D 4D FC             lea         ecx,[ebp-4]            ;將this指針保存到ecx中
0040103B E8 CA FF FF FF call @ILT+5(CDemo::CDemo) (0040100a)  ;調用對象的構造函數 19: 20: 21: return 0; 00401040 33 C0 xor eax,eax 22: } 00401042 5F pop edi 00401043 5E pop esi 00401044 5B pop ebx 00401045 83 C4 44 add esp,44h 00401048 3B EC cmp ebp,esp 0040104A E8 51 00 00 00 call __chkesp (004010a0) 0040104F 8B E5 mov esp,ebp 00401051 5D pop ebp 00401052 C3 ret

從以上反彙編代碼能夠發現,局部對象在建立之後,編譯器會當即調用對象的構造函數。與調用通常成員函數同樣,編譯器會將this指針保存到ecx中,做爲參數傳遞。繼續單步進入構造函數,反彙編以下作用域

3:    class CDemo
4:    {
5:    public:
6:        CDemo()
00401060 55                   push        ebp
00401061 8B EC                mov         ebp,esp
00401063 83 EC 44             sub         esp,44h
00401066 53                   push        ebx
00401067 56                   push        esi
00401068 57                   push        edi
00401069 51                   push        ecx      ;ecx中保存的是this指針
0040106A 8D 7D BC             lea         edi,[ebp-44h]
0040106D B9 11 00 00 00       mov         ecx,11h
00401072 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401077 F3 AB                rep stos    dword ptr [edi]
00401079 59                   pop         ecx      ;還原ecx
0040107A 89 4D FC             mov         dword ptr [ebp-4],ecx  ;將ecx存放在一個臨時變量中
7:        {
8:            m_nInt = 100;
0040107D 8B 45 FC             mov         eax,dword ptr [ebp-4]  ;將ecx傳遞給eax
00401080 C7 00 64 00 00 00    mov         dword ptr [eax],64h    ;至關於[this + 0],利用this指針+偏移找到第一個數據元素
9:        }
00401086 8B 45 FC             mov         eax,dword ptr [ebp-4]   ;將this指針返回
00401089 5F                   pop         edi
0040108A 5E                   pop         esi
0040108B 5B                   pop         ebx
0040108C 8B E5                mov         esp,ebp
0040108E 5D                   pop         ebp
0040108F C3                   ret

根據構造函數的反彙編代碼能夠發現,C++語法上雖然規定構造函數是沒有返回值的,可是編譯器的實現上缺將this指針做爲構造函數的返回值。編譯器

相關文章
相關標籤/搜索