现有一个函数lengthCompare

  1. bool lengthCompare(const string &,const string &);

想声明一个函数指针,只需要用指针替换函数名即可:

  1. // pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool
  2. bool (*pf) (const string & ,const string &); //未初始化

*pf 两端的括号必不可少,不加的话就代表pf是一个返回值为bool指针的函数

使用函数指针

当我们将函数名作为一个值使用时,该函数自动转换成指针。例如,我们可以将lengthCompare的地址赋给pf:

  1. pf = lengthCompare; // pf指向名为lengthCompare的函数
  2. pf = &lengthCompare; // 等价语句;取地址符是可选的

还可以直接使用指向该函数的指针调用该函数

  1. bool b1 = pf("hello","goodbye");
  2. bool b2 = (*pf)("hello","goodbye");
  3. bool b3 = LengthCompare("hello","goodbye");

在指向不同函数类型的指针间不存在转换规则。但是和往常一样,可以为函数指针赋一个nullptr,表示该指针没有指向任何一个函数:

  1. string::size_ type sumLength (const string&, const string&) ;
  2. bool cstringCompare (const char*, const char*) ;
  3. pf=0; //正确:pf不指向任何函数
  4. pf = sumLength; //错误:返回类型不匹配
  5. pf = cstringCompare; //错误:形参类型不匹配
  6. pf = lengthCompare; //正确:函数和指针的类型精确匹配

总之就是参数类型和个以及返回值严格匹配就可以

重载函数的指针

使用重载函数时,上下文必须清晰界定到底应该使用哪个函数。如果定义了指向重载函数的指针

  1. void ff(int*);
  2. void ff(unsigned int);
  3. void (*pf1)(unsigned int) = ff; //pf1指向ff(unsigned)

函数指针形参

和数组类似,虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。此时形参看起来是函数类型,实际上是可以当做函数指针来用:

  1. // 第三个是函数类型,它会自动转换成指向函数的指针
  2. void usrBigger(const string &s1, const string &s2, bool pf(const string &,const string &));
  3. // 等价的声明:显式的将参数定义成指向函数的指针
  4. void useBigger(const string &s1, const string &s2, bool (*pf)(const string &,const string &));