现有一个函数lengthCompare
:
bool lengthCompare(const string &,const string &);
想声明一个函数指针,只需要用指针替换函数名即可:
// pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool
bool (*pf) (const string & ,const string &); //未初始化
*pf 两端的括号必不可少,不加的话就代表pf是一个返回值为bool指针的函数
使用函数指针
当我们将函数名作为一个值使用时,该函数自动转换成指针。例如,我们可以将lengthCompare的地址赋给pf:
pf = lengthCompare; // pf指向名为lengthCompare的函数
pf = &lengthCompare; // 等价语句;取地址符是可选的
还可以直接使用指向该函数的指针调用该函数
bool b1 = pf("hello","goodbye");
bool b2 = (*pf)("hello","goodbye");
bool b3 = LengthCompare("hello","goodbye");
在指向不同函数类型的指针间不存在转换规则。但是和往常一样,可以为函数指针赋一个nullptr,表示该指针没有指向任何一个函数:
string::size_ type sumLength (const string&, const string&) ;
bool cstringCompare (const char*, const char*) ;
pf=0; //正确:pf不指向任何函数
pf = sumLength; //错误:返回类型不匹配
pf = cstringCompare; //错误:形参类型不匹配
pf = lengthCompare; //正确:函数和指针的类型精确匹配
总之就是参数类型和个以及返回值严格匹配就可以
重载函数的指针
使用重载函数时,上下文必须清晰界定到底应该使用哪个函数。如果定义了指向重载函数的指针
void ff(int*);
void ff(unsigned int);
void (*pf1)(unsigned int) = ff; //pf1指向ff(unsigned)
函数指针形参
和数组类似,虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。此时形参看起来是函数类型,实际上是可以当做函数指针来用:
// 第三个是函数类型,它会自动转换成指向函数的指针
void usrBigger(const string &s1, const string &s2, bool pf(const string &,const string &));
// 等价的声明:显式的将参数定义成指向函数的指针
void useBigger(const string &s1, const string &s2, bool (*pf)(const string &,const string &));