From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx
个人感觉对于类的成员函数指针这块讲解的比较深入详细
推荐阅读
/
先看这样一段代码
class test
{
public:
test(int i){ m_i=i;}
test(){}
void hello()
{
printf("hello/n");
}
private:
int m_i;
};
int main()
{
test *p=new test();
p->hello();
p=NULL;
p->hello();
}
结果是:
hello
hello
为何
p=NULL;
p->hello(); 这样之后,NULL->hello()也依然有效呢?
我们第一反应一定是觉得类的实例的成员函数,不同于成员变量,成员函数全部都存在同一个地方,所以的类的实例来调用的时候,一定是调用相同的函数指针。(想想也是有道理的,成员函数都是一样的功能,根本不需要实例化多个)
于是我们把代码改成这样
class test
{
public:
test(int i){ m_i=i;}
test(){}
void hello()
{
printf("hello/n");
}
private:
int m_i;
};
typedef void (test::*HELLO_FUNC)();
int main()
{
test *p=new test();
test q;
p->hello();
HELLO_FUNC phello_fun=&test::hello;
printf("%p/n",phello_fun);
p=NULL;
phello_fun=&test::hello;
printf("%p/n",phello_fun);
phello_fun=p->hello;
printf("%p/n",phello_fun);
phello_fun=q.hello;
printf("%p/n",phello_fun);
p->hello();
}
结果是:
hello
00401005
00401005
00401005
00401005
hello
Press any key to continue
也就是说不管是&test::hello,还是p->hello,或者q.hello,甚至于NULL->hello.
调用的地址都是0x00401005,也基本印证了我们的猜想。
事情到这里算是完了么?没有。
有人问道这样一段代码:
SSVector& SSVector::assign2product4setup(const SVSet& A, const SSVector& x)
{
int ret_val=
pthread_create(&pt,NULL,(void(*)(void*))SSVector::prefun,x);
}
void* SSVector::prefun (void* arg){
const SSVector &tx =*((SSVector*) arg);
}
行报错:invalid conversion from 'void (*)(void*)' to 'void* (*)(void*)'
pthread_create我就不解释了,第3个参数是线程函数的指针,为何这里报错呢?