C++中的函数指针
这里记录一下函数指针的学习。
使用
函数指针顾名思义就是指向一个函数的指针,函数指针可以理解成指向函数入口地址的指针。函数指针的定义如下:
bool (*pf)(int,int);//指向一个形参为(int,int),返回值为bool值的指针,记得使用括弧bool* pf(int,int);//该形式并不是函数指针,而是返回一个指针类型的函数
使用如下:
bool (*pf)(int,int);bool check(int a,int b){ return a==b;}bool bigger(int a,int b){ return a>b;}int main(int argc, char* argv[]){ int a=34,b=34; pf=check;//等价于pf=✓ cout<<
对于函数指针的定义而言,理解起来有点费劲,使用C++ Primer书中的解释理解:
对于函数指针,可以从名字开始观察,pf前面有个*,因此pf是指针;右侧是形参列表,标识pf指向的是一个函数;再观察左边,返回的是一个bool类型。因此pf就是一个指向函数的指针,该函数有两个形参,返回类型为bool值。
函数指针与形参
函数指针也可以充当形参在方法中传入:
bool bigger(int a,int b){ return a>b;}bool (*pf)(int,int);void testConfig(int k,bool pf(int a,int b)){ bool value=pf(12,1); cout<<<" "< <
由于使用上述方式声明函数指针显得冗长繁琐,所以可以通过typedef以及decltype来简化我们的代码:
bool check(int& a,int b){ return a==b;}bool bigger(int a,int b){ return a>b;}bool (*pf)(int,int);void testConfig(int k,bool pf(int a,int b)){ bool value=pf(12,1); cout<<<" "< <
上述代码中可以看到,使用dePo代替了指向bigger()函数的函数指针。
需要注意的是decltype返回函数类型,此时是不会讲函数类型自动转换为指针的,需要显式在在dePo前面加个*来标明对应为指针类型。
tip:
需要注意decltype()和decltype(())的区别(推导四规则):
int i=10;decltype(i) a; //a推导为intdecltype((i))b=i;//b推导为int&,必须为其初始化,否则编译错误
返回指向函数的指针
和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针。需要注意的是,我们必须把返回类型写成指针的形式,编译器不会自动的将函数返回类型当做对应指针的类型处理:
bool bigger(int a,int b){ return a>b;}using PF= bool (*)(int,int);//PF为函数指针using PFD=bool(int,int);//PFD是函数类型,不是指针PFD *f1(int){//显示指定返回类型为函数指针 return bigger;}PF f2(int,bool pf(int,int)){// ... return bigger;}
我们也可以不用using来直接声明返回的函数指针:
bool (*f3(int a))(int b,int c){ return bigger;}
这样就有点绕了,可以按照由内向外的顺序进行阅读,f3有形参a,说明是一个函数,前面有一个*号,所以返回的是一个指针,而指针有参数b,c,说明这个指针指向一个函数,这个函数的返回值为布尔值。
使用尾置类型可能更好理解一些:
auto f4(int)->int(*)(int,int);