定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数)。一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量。而对于同一个类的每一个对象,都是共享同一份类函数。对象有单独的变量,但是没有单独的函数,所以当调用函数时,系统必须让函数知道这是哪个对象的操作,从而确定成员变量是哪个对象的。这种用于对成员变量归属对像进行区分的东西,就叫做this指针。事实上它就是对象的地址.
记得孙鑫VC++视频教程里有一段剖析MFC的代码,大意就是 CTESTAPP类是CWINAPP的子类,而CTESTAPP创建一个全局对象时,在CWINAPP的构造函数里面用了this指针,但是这里this指针指向的的是CTESTAPP的对象,而不是所在类的对象,也许读者这时候对这个this指针有点糊涂了! 不要怕!马上让你明明白白! 请看下面一段代码:
- #include <iostream.h>
- class PARENT{//基类
- int d; public:
- PARENT()
- { d=1;
- cout<<"PARENT this ="<<this<<endl;
- cout<<"d="<<this->d<<endl;
- }
- };
- class CHILD : public PARENT//子类
- { int b;
- public:
- CHILD():PARENT()
- { b=2;
- cout<<"CHILD this = "<<this<<endl;
- cout<<"b="<<this->b<<endl;
- }
- };
- int main(int argc, char* argv[])
- { CHILD cb;//CHILD对象
- cout<<"CHILD object cb's addr is="<<&cb<<endl;
- return 0;
- }
这段代码和上面提到的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指针代替子类对象用!