函数指针指向的是函数而非对象。和其他类型一样,函数指针指向某种特定类型。因为函数的类型由它的返回类型和形参类型共同决定,与函数名无关,所以想要声明一个函数指针,只需要用指针替换函数名即可,例如:
比较字符串长度的函数:bool LengthCompare(const string &, const string &);
此函数的函数指针为: bool (*pf)(const string &, const string &);
pf指向一个函数,函数的参数是两个const string的引用,返回值是bool类型。*pf两端的括号必不可少,如果不写会变成:
bool *pf (const string &, const string &); 此时pf是一个返回值为bool指针的函数。
函数指针的使用:
1、当把函数名作为一个值使用时,该函数自动地转换为指针。
pf = LengthCompare; //pf指向名为LengthCompare的函数
pf = &LengthCompare; //等价的赋值语句,取地址符是可选的
同时,直接使用指向函数的指针调用该函数时,无须提前解引用指针。
bool b1 = pf("hello", "world"); //调用LengthCompare函数
bool b2 = (*pf)("hello", "world"); //一个等价的调用
bool b1 = LengthCompare("hello", "world"); //另一个等价的调用
2、函数指针形参(正向调用和反向调用,反向调用即回调函数)
利用函数指针形参,函数调用和任务的编写可以分开。这样的话,这要是这个函数类型的函数,传入不同的函数名,就能执行不同的函数体,用这种方法实现了类似于C++多态的形式。
回调函数是利用函数指针实现的一种调用机制,回调机制原理: 当具体时间发生时,调用者通过函数指针调用具体函数,回调机制将调用者和被调函数分开,两者互不依赖。
回调函数应用举例:
#include <iostream> using namespace std; typedef void (*callback)(int x); // 定义一个函数指针类型 void myFunc1(int x) // myFunc1 的声明要与callback一样 { cout << "This is myFunc1 " << x << endl; } void myFunc2(int x) { cout << "This is myFunc2 " << x << endl; } void callMyFunc(callback cb, int x) // 把函数指针类型当做调用函数参数类型 { cb(x); } int main() { callMyFunc(myFunc1, 1); callMyFunc(myFunc2, 2); return 0; }
3、返回指向函数的指针
和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针,但是,我们必须把返回类型写成指针形式,因为编译器不能自动地将函数返回类型当成对应的指针的类型处理。声明返回函数指针的函数简单的办法就是使用类型别名。
返回函数指针应用举例:
#include<iostream> using namespace std; using F = int(*)(int); int a(int m){return m;} F f1(){return a;} int main() { cout << "function a(10) vaule is: " << a(10) << endl; cout << "function f1()(5) vaule is: " << f1()(5) << endl; return 0; }