函数指针:
void f(){}
void (*pf)() = f; //指向函数f的指针
void (*pf2)() = &f; //'&'操作符可有可无
(*pf)(); //调用函数f()
pf(); //像普通的函数调用一样
//另外一种更好的方法,用typedef将函数的指针的定义分为几步
typedef void (dclFun)(); //dclFun相当于一个函数原形。推荐
typedef void dclFun2(); //与上一个等同,没上一个清晰
dclFun *pf3 = f; //指向函数f的指针。 推荐
(*pf3)();
//函数指针数组:
void (* pf4[])() = {f, f, f}; //pf为一个数组,其成员为指向函数的指针
dclFun * pf5[] = {f, f, f}; //意义与上句同,但毫无疑问要清晰很多。 推荐
pf4[0](); //调用函数f()。 推荐
(pf4[1])(); //调用函数f()
(*(pf4 + 2))(); //调用函数f()
*pf4(); //error: 此句等同于:*(pf4()), 而pf4为一个数组
//当函数为类的一个成员时:定义不同了,要指明class scope
class A
{
void g(){}
}
void (A:: *pg)() = A::g; //指向类A的成员函数的指针
//注意:变量名总与指针符*在一起,下面是些错误的写法
//error: void A::(*pg)();
// void (* A::pg)();
// A::void (*pg)();
dclFun A:: *pg3 = A::g; //Ok. 与上句同。(注意:dclFun已在前面定义)。推荐
A a;
(a.*pg3)(); //调用A::g,使用'.*'操作符,这个是指向类成员(member data/ method)指针的专用操作符
//'.*'比'*'低一档,所以使用它时最好用括号括起来。下面是些错误的写法:
//error: a.*pg(); //这个等同于 a.*(pg()),而直接调用pg()是错误的
// 推荐
//下面企图把'A::'包含在typedef中然后再重命名,都失败了:
/* error:
typedef void A:: dclFunOfA();
typedef void (A:: dclFunOfA)();
typedef void A:: (dclFunOfA)();
typedef A:: void (dclFunOfA)();
typedef void (dclFunOfA)()A:: ;
typedef dclFun A:: dclFunOfA;
typedef A:: dclFun dclFunOfA;
typedef dclFun dclFunOfA A:: ;
typedef (A:: *dclFunOfA)(); //这个倒可以,但dclFunOfA不是函数的声明,而是一个函数指针,不是想要的
*/
//函数指针数组
void (A:: * pg4[]){} = {A::g, A::g, A::g};
dclFun A:: * pg5[] = {A::g, A::g, A::g}; 推荐
(a.*( pg4[0] ))(); //调用函数A::g
(a.*pg4[1])(); //调用函数A::g,'[]'的优先级比'.*'高。 推荐
(a.*( *(pg4 + 2) ) )(); //调用函数A::g
(a.* *(pg4 + 2) )(); //调用函数A::g。