C++中this指针存放在哪里

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;

  4. //CPerson类
  5. class CPerson
  6. {
  7.     int m_nAge;//年龄
  8.     char m_strName[256];//姓名
  9. public:
  10.     //构造函数
  11.     CPerson(int age, char* name)
  12.     {
  13.         m_nAge = age;
  14.         strncpy(m_strName, name, sizeof(m_strName)-1);
  15.     }
  16.     //获取年龄
  17.     void GetAge(void)
  18.     {
  19.         cout << "年龄:" << m_nAge << endl;
  20.     }
  21.     //获取姓名
  22.     void GetName(void)
  23.     {
  24.         cout << "姓名:" << m_strName << endl;
  25.     }
  26. };

  27. //结构体类型 TagPerson
  28. struct TagPerson
  29. {
  30.     int m_nAge;//年龄
  31.     char m_strName[256];//姓名
  32. };
  33. //获取年龄
  34. void GetAge(TagPerson *per)
  35. {
  36.     cout << "年龄:" << per->m_nAge << endl;
  37. }
  38. //获取姓名
  39. void GetName(TagPerson *per)
  40. {
  41.     cout << "姓名:" << per->m_strName << endl;
  42. }

  43. int main()
  44. {
  45.     CPerson 刘德华(55, "刘德华");
  46.     CPerson 李连杰(57, "李连杰");

  47.     TagPerson 周润发;
  48.     周润发.m_nAge = 56;
  49.     strncpy(周润发.m_strName, "周润发", 255);

  50.     刘德华.GetAge();
  51.     刘德华.GetName();

  52.     GetAge(&周润发);
  53.     GetName(&周润发);

  54.         return 0;
  55. }
复制代码
此段代码中声明了一个CPerson类和一个TagPerson结构体类型。在C语言中用一个函数来获取和设置结构体变量, 我们是通过传递这个变量的指针来实现的。那么C++中类成员函数是如何知道哪个对象调用了它?并正确显示调用它的对象的数据呢? 很多书上也都已经介绍了, 当一个对象调用某成员函数时会隐式传入一个参数, 这个参数就是this指针。this指针中存放的就是这个对象的首地址。 这和C中通过向函数传递结构体变量的地址是不是很像?!只是传参形式不一样罢了!  在C中我们是手工把结构体变量和函数关联起来的,而C++则是编译器帮我们把类数据和成员函数关联起来的并通过名称粉碎和编译时检查等形式防止外部的任意访问。 那么这个this指针存放在哪里呢?其实编译器在生成程序时加入了获取对象首地址的相关代码。并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同)。也就是成员函数的其它参数正常都是存放在栈中。而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。 让我们调试,并对EXC进行手动修改会发现一点有趣的现象。
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;

  4. //CPerson类
  5. class CPerson
  6. {
  7.     int m_nAge;//年龄
  8.     char m_strName[256];//姓名
  9. public:
  10.     //构造函数
  11.     CPerson(int age, char* name)
  12.     {
  13.         m_nAge = age;
  14.         strncpy(m_strName, name, sizeof(m_strName)-1);
  15.     }
  16.     //获取年龄
  17.     void GetAge(void)
  18.     {
  19.         cout << "年龄:" << m_nAge << endl;
  20.     }
  21.     //获取姓名
  22.     void GetName(void)
  23.     {
  24.         cout << "姓名:" << m_strName << endl;
  25.     }
  26. };

  27. int main()
  28. {
  29.     CPerson 刘德华(55, "刘德华");
  30.     CPerson 李连杰(57, "李连杰");

  31.     刘德华.GetName();

  32.         return 0;
  33. }
复制代码
第一次我们单步步入成员函数GetName();

 
函数正确的访问到了对象刘德华的内存空间。停止调试我们再来一遍并做点小手脚。。^^




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值