構造函數是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指針做爲構造函數的返回值。編譯器