函数指针
bool leng (const string & ,const string &);
bool (*pf) (const string & ,const string &);//把上面的函数名替换为(*pf) ,既声明pf指向一个函数,但并未初始化
//函数指针指向的函数必须与自己声明的函数类型以及形参类型一致
pf = leng ; pf = &leng //两个等价声明,pf指向leng函数,取地址符&是可选的
//当我们把函数名作为一个值使用时,函数自动转换成指针
//那我们现在可以用pf调用函数了
pf(“hello”,"word");
(*pf)(“hello”,"word");
leng (“hello”,"word"); //以上三个都是等价的调用
pf = ;//正确:pf不指向任何函数
重载函数的指针
一句话:返回类型和形参类型精确匹配:
void ff(int *);
void ff(unsigned int);
void (*p)(unsigned int) = ff;//p指向的是ff(unsigned int)
void (*p)( int) = ff;//错误:没有任何一个匹配
double (*p)( int*) = ff;//错误:返回类型不匹配
返回指向函数的指针:类似于返回指向数组的指针
using F =int(int * , int); //F 是函数类型 不是指针
using FF = int (*) (int * ,int) //FF是指针类型
FF f1(int i); //正确
F f1(int i); //错误F是一个函数 不能返回一个函数
F * f1(int i); //正确 显示指定返回为指向函数的指针
//直接声明
int (*f1(int i))(int * , int);
//尾zhi类型
auto fi(int i) -> int(*) (int * ,int );
举例应用返回指向函数的指针
int add(int a, int b)
{
return a + b;
}
int substract(int a, int b)
{
return a - b;
}
int main()
{
typedef int(*p)(int a, int b);//声明函数指针,未初始化,p为指向函数的指针。
//使用typedef的声明语句定义的不再是变量而是类型别名
//就是将变量转化为类型别名的一种方式,p原来是指向函数的指针变量,
//现在变成了指向函数的指针变量的类型别名
using p = int (*) (int * ,int) //FF是指向函数指针类型 跟上面一样
vector<p> vec{add,substract};
for (auto c : vec)
cout << c(2, 2) << endl; //结果就是调用两个函数 输出 4 0
}