函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。
当我们把函数名作为一个值使用时,该函数自动地转换成指针。直接使用指向含税的指针调用该函数,无须以前解引用指针。
在指向不同函数类型的指针间不存在转换规则。但是和往常一样,我们可以为函数指针赋给一个nullptr或者值为0的整箱常量表达式表示该指针没有指向任何一个函数。
使用decltype简化声明:
当我们把函数名作为一个值使用时,该函数自动地转换成指针。直接使用指向含税的指针调用该函数,无须以前解引用指针。
在指向不同函数类型的指针间不存在转换规则。但是和往常一样,我们可以为函数指针赋给一个nullptr或者值为0的整箱常量表达式表示该指针没有指向任何一个函数。
重载函数的指针
编译器通过指针类型决定选用那个函数,指针类型必须与重载函数中的某一个精确匹配。函数指针形参
虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。此时,形参看起来是函数类型,实际上却是当成指针使用://第三种形参是函数类型,它会自动地转换成指向函数的指针
void useBigger(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 &));
我们可以直接把函数作为实参使用,此时它会自动转换成指针:
//自动将函数lengthCompare转换成指向该函数的指针
useBigger(s1,s2,lengthCompare);
使用decltype简化声明:
//func和func2是函数类型
typedef bool func(const string &,const string &);
typedef decltype(lengthCompare) func2; //等价的类型
//funcp和funcp2是指向函数的指针
typedef bool (*funcp)(const string &,const string &);
typedef decltype(lengthCompare) *funcp2; //等价的类型
decltype返回函数类型,此时不会将函数类型自动转换成指针类型。因为decltype的结果是函数类型,所以只有在结果前面加上*才能得到指针。
返回指向函数的指针
想返回函数类型的指针,我们必须把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理。要想声明一个返回函数指针的函数,最简单的办法是使用类型别名:using F = int (int*,int); //F是函数类型,不是指针
using PF = int(*) (int*,int); //PF是指针类型
和函数类型的形参不一样,返回类型不会自动地转换成指针。我们必须显式地将返回类型指定为指针:
PF f1(int);
F *f1(int);
当然,我们也能用下面的形式直接显式声明f1:
int (*f1(int))(int*,int);
使用尾置返回类型的方式声明一个返回函数指针的函数:
auto f1(int)->int(*)(int *,int);