2012.1.12 区分->*和.*

class Ctest
{
public:
 void fun(){cout<<"fuck!"<<endl;}
 int nTest;
};

void (Ctest::*ptrFun)() = &Ctest::fun;
int Ctest::*ptrTest = &Ctest::nTest;

int main()
{
 Ctest *ptrCtest = new Ctest();
 ptrCtest->*ptrTest = 100;
 
 cout<<ptrCtest->*ptrTest<<endl
  <<ptrCtest->nTest<<endl;
 (ptrCtest->*ptrFun)();
 delete ptrCtest;

 Ctest obj;
 obj.*ptrTest = 200;

 cout<<obj.*ptrTest<<endl
  <<obj.nTest<<endl;
 (ptrCtest->*ptrFun)();

 

}

 

 

->*和.*的区别与->和.的区别一样的
只是他们俩是针对成员函数指针调用而已
 
前面那个*,其实不是和->与.结合,而是与后面的函数指针结合
表示取出一个函数对象
至于你前面说的,对象析构了为何还可以调用其函数指针
原因是类的成员函数地址与类实例的内存空间是分离的
类实例不存在,其实也可以直接调用类成员函数

类成员函数的调用和普通函数调用唯一的不同是,类成员函数需要一个this指针
当类实例不存在,且类成员函数内部没有使用到this指针时,你可以使用如上的方法随意调用类成员函数
就像static方法一样
当然,如果类成员函数使用了实例指针this时,你的类实例析构后再调用此函数会导致内存访问异常的

 

 

 

如果&Ctest::fun这个函数的地址是0xABCDABCD
那么(ptrCtest->*ptrFun)()这段代码翻译成机器码就是 call 0xABCDABCD
0xABCDABCD 这个地址一直存在的

函数的指针是全局的,不会被删除掉的
posted @ 2012-01-12 23:34  rookieeeeee  阅读(262)  评论(0编辑  收藏  举报