参考
C++ Primer 7.10函数指针
241页
引文
通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*pf)替换函数名。这样pf就是这类函数的指针。
如:
double pam(int)
->
double (*pf)(int)
使用指针来调用函数
用指针来调用被指向的函数。线索来自指针声明。(*pf)扮演的角色与函数名相同,因此使用(*pf)的时候,只需将它看做函数名即可。
double pam(int);
double (*pf)(int);
pf = pam;
double x = pam(4);
double y = (*pf)(5);
实际上,C++也允许像使用函数名那样使用pf:
double y = pf(5);
第一种格式虽然不太好看,但它给出了强有力的提示–代码正在使用函数指针。
历史与逻辑
真的是非常棒的语法!为何pf和(*pf)等价呢?一种学派认为,由于pf是函数指针,而(*pf)是函数,因此应将(*pf)()用作函数调用。另一种学派认为,由于函数名是指向该函数的指针,指向函数的指针的行为盈余函数名相似,因此应将pf()用作函数调用使用。C++进行了折中–这2种方式都是正确的,或者至少是允许的,虽然它们在逻辑上是互相冲突的。在认为这种折衷粗糙之前,应该想到,容忍逻辑上无法自圆其说的观点正是人类思维活动的特点。