classCNullPointCall { public: staticvoidTest1(); voidTest2(); voidTest3(intiTest); voidTest4(); private: staticintm_iStatic; intm_iTest; }; intCNullPointCall::m_iStatic=0; voidCNullPointCall::Test1() { cout<<m_iStatic<<endl; } voidCNullPointCall::Test2() { cout<<"VeryCool!"<<endl; } voidCNullPointCall::Test3(intiTest) { cout<<iTest<<endl; } voidCNullPointCall::Test4() { cout<<m_iTest<<endl; } |
pNull->Test1(); //call1 pNull->Test2();//call2 pNull->Test3(13);//call3 pNull->Test4();//call4 |
你肯定会很奇怪我为什么这么问。一个值为NULL的指针怎么可以用来调用类的成员函数呢?!可是实事却很让人吃惊:除了call 4那行代码以外,其余3个类成员函数的调用都是成功的,都能正确的输出结果,而且包含这3行代码的程序能非常好的运行。
经过细心的比较就可以发现,call 4那行代码跟其他3行代码的本质区别:类CNullPointCall的成员函数中用到了this指针。
对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。而成员函数之所以能把属于此类的各个对象的数据区别开, 就是靠这个this指针。函数体内所有对类数据成员的访问, 都会被转化为this->数据成员的方式。