1 #include "stdafx.h" 2 #include "iostream" 3 4 using namespace std; 5 6 class stu 7 { 8 private: 9 int Id; 10 int Age; 11 int Tall; 12 int Sex; 13 public: 14 void setID(int a); 15 void setAge(int a); 16 void setTall(int a); 17 int getId(); 18 int getAge(); 19 int getTall(); 20 void IP() 21 { 22 cout << this << endl; 23 } 24 }; 25 26 void stu::setID(int a) 27 { 28 Id = a; 29 } 30 void stu::setAge(int a) 31 { 32 Age = a; 33 } 34 void stu::setTall(int a) 35 { 36 Tall = a; 37 } 38 int stu::getId() 39 { 40 return Id; 41 } 42 int stu::getAge() 43 { 44 return Age; 45 } 46 int stu::getTall() 47 { 48 return Tall; 49 } 50 51 52 int main(int argc, char* argv[]) 53 { 54 stu liu; //用类stu定义一个名为liu的对象. 55 liu.setID(2); //从这个函数的的反汇编得出里面的ECX=0018FF38 56 liu.IP(); //这个函数里面打印了this的值,也是0018FF38 57 cout << &liu << endl ; //打印的结果是0018FF38 58 return 0; 59 } 60 /* 61 结论: 62 ********************************************************************* 63 1.this指针指向的是当前对象"首地址". 64 2.对象里面的函数成员的函数框架里面ECX存放的就是当前对象的"首地址". 65 3.用 &liu 这样的方法也可以得出当前对象的首地址. 66 */ 67 68 69 70 /* 71 反汇编分析 72 50: { 73 00401400 push ebp 74 00401401 mov ebp,esp 75 00401403 sub esp,50h 76 00401406 push ebx 77 00401407 push esi 78 00401408 push edi 79 00401409 lea edi,[ebp-50h] 80 0040140C mov ecx,14h 81 00401411 mov eax,0CCCCCCCCh 82 00401416 rep stos dword ptr [edi] 83 51: stu liu; //反汇编时,如果在这里下了断点,调试时调试箭头会移动到 return 0 这里. 84 52: //因为stu liu 只是定义了一个对象,没有具体进行操作. 85 53: return 0; 86 00401418 xor eax,eax 87 54: } 88 0040141A pop edi 89 0040141B pop esi 90 0040141C pop ebx 91 0040141D mov esp,ebp 92 0040141F pop ebp 93 00401420 ret 94 //从 sub esp,50h 来看,因为是定义了对象liu ,所以多了10h的内存空间. 95 //在类里面有4个int 变量和6个函数.可以看出,类的数据成员是会向调用函数申请空间的, 96 //而函数成员是不会向调用函数申请占内存的. 97 */