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指针
当类实例不存在,且类成员函数内部没有使用到this指针时,你可以使用如上的方法随意调用类成员函数
就像static方法一样
当然,如果类成员函数使用了实例指针this时,你的类实例析构后再调用此函数会导致内存访问异常的
如果&Ctest::fun这个函数的地址是0xABCDABCD
那么(ptrCtest->*ptrFun)()这段代码翻译成机器码就是 call 0xABCDABCD
0xABCDABCD 这个地址一直存在的
那么(ptrCtest->*ptrFun)()这段代码翻译成机器码就是 call 0xABCDABCD
0xABCDABCD 这个地址一直存在的
函数的指针是全局的,不会被删除掉的