c++ 中指向函数的指针初始化和使用

对指针的声明没问题,问题处在声明后的使用。
众所周知,函数指针分为两类
1.普通函数指针
声明:void f( ) { };
void (*p)( ) { };
请问,对p赋值时正确的是:
A: p=f
B: p=&f
使用指针函数正确的是:
C: p( );
D: (*P)( );
PS:我自己编译运行过,两种方式都正确,请问这是什么原因?

2.成员函数指针
声明: void Time::f( ) { }
void (Time::*p)( ) { }
请问赋值时正确的是:
E: p=Time::f
F: p=&Time::f;
使用指针函数时正确的是:
G (t.p)( )
H (t.*p)( )

题目很长,谢谢各位帮我解决下这个问题,是两种方式都可以吗?是否有什么区别呢?

1.A 2.D
都正确的原因是,p=f时会进行隐式类型转换,f被转换成指针类型
p=&f我就不解释了,指针赋值很明显
再一个void f( ) { };不是声明,是定义
void f();这才是声明

下面两个不会
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-04-29
 C++指向函数的指针定义方式为:
  返回类型 (*指针名)(函数参数列表),例如 void (*p)(int)是指向一个返回值为void 参数为int类型的函数。
  而若想定义一个指向类成员函数的函数指针该怎么定义呢?对成员函数指针的使用。
  (1)非静态成员函数
  定义方式:返回类型 (类名::*指针名)(函数参数列表)例如void (A::*p)(int)是一个指向A类中成员函数的函数指针。
  赋值方式:p=&A::函数名,而一般的函数指针的赋值是p=函数名即可,注意区别。(成员函数必须是public类型的)
  调用方式:成员函数指针的调用必须通过类对象进行调用,a.*p(int)即可调用成员函数(该成员函数是public类型的)
  (2)静态成员函数
  对于静态成员函数的定义和使用方法都与普通函数指针的相同,只是在赋值的时候和非静态成员们函数指针的赋值方法相同。
  因为静态成员函数的指针类型是与普通函数指针类型相同的。
第2个回答  2011-05-16
详见:《指针的艺术》

PS:台湾作者写的。你买本看看
相似回答