谈谈基类与子类的this指针(C++)

48 篇文章 0 订阅

谈谈基类与子类的this指针(C++)

引入

  定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数)。一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量。而对于同一个类的每一个对象,都是共享同一份类函数对象有单独的变量,但是没有单独的函数,所以当调用函数时,系统必须让函数知道这是哪个对象的操作,从而确定成员变量是哪个对象的。这种用于对成员变量归属对像进行区分的东西就叫做this指针。事实上它就是对象的地址.

          记得孙鑫VC++视频教程里有一段剖析MFC的代码,大意就是 CTESTAPP类是CWINAPP的子类,而CTESTAPP创建一个全局对象时,在CWINAPP的构造函数里面用了this指针,但是这里this指针指向的的是CTESTAPP的对象,而不是所在类的对象,也许读者这时候对这个this指针有点糊涂了! 不要怕!马上让你明明白白! 请看下面一段代码:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream.h>    
  2. class PARENT{//基类       
  3.              int d; public:   
  4.              PARENT()  
  5.                 { d=1;   
  6.                   cout<<"PARENT this ="<<this<<endl;                
  7.                   cout<<"d="<<this->d<<endl;       
  8.                  }   
  9.   
  10.              };    
  11. class CHILD : public PARENT//子类    
  12.           {  int b;      
  13.   
  14.       public:   
  15.             CHILD():PARENT()  
  16.                    {  b=2;    
  17.                       cout<<"CHILD this = "<<this<<endl;    
  18.                       cout<<"b="<<this->b<<endl;       
  19.                     }   
  20.            };    
  21. int main(int argc, char* argv[])   
  22. {   CHILD cb;//CHILD对象    
  23.     cout<<"CHILD object cb's addr is="<<&cb<<endl;    
  24.     return 0;   
  25. }   

        这段代码和上面提到的MFC的代码原理一样!此代码运行的结果你会发现this的值都一样!而且this都是指向cb对象的! 
因为this指针式在创建一个对象时,隐含的将对象的地址赋予一个指针,那就是this指针。在创建对象cb时,先讲cb的首地址赋给this,根据继承性,首先调用基类的构造函数,虽然此时cb对象还未完全创建(必须调用完子类的构造函数时,此时对象才会创建完毕),但是此时cb对象的基类部分已经构造完毕,所以这时候的this指针可以看成是cb的this指针,但是只能调用基类PARENT的数据成员。如果此时你在PARENT()里加上一句cout<<"b="<<this->b<<endl;让其调用子类的数据成员,则会报错!因为this指向的对象没有构造子类的部分!在执行完基类的构造函数进入子类的构造函数后,这时候this指向的对象构造完成,这时候this指针也就是一个真正的的指向cb的常指针了。

        这时候你也不难理解了MFC当中CWINAPP传递的this指针是指向子类CTESTAPP的对象,而不是所在类CWINAPP了!这里在基类中使用this的意思有点像,由于子类对象没构造好,但是指向对象的指针已近指向那个对象了,早晚对象都会构造好的,那不如先拿this指针代替子类对象用!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值