博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的函数指针
阅读量:6245 次
发布时间:2019-06-22

本文共 1828 字,大约阅读时间需要 6 分钟。

hot3.png

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);

转载于:https://my.oschina.net/u/3863980/blog/1843956

你可能感兴趣的文章
魅族mx5详细打开usb调试模式的步骤
查看>>
ConstraintLayout的使用教程
查看>>
前后端俱全的 具有聊天功能的 react 项目
查看>>
Redux reselect
查看>>
Spring 通过xml获得容器的三种方法比较
查看>>
MySQL索引面试题
查看>>
Systemd 入门教程:命令篇
查看>>
JS 常用函数垫片
查看>>
快速批量检查所有虚拟机的各项指标
查看>>
【软件开发底层知识修炼】五 gcc-C语言编译器
查看>>
React组件生命周期
查看>>
RxJava2.0的初学者必备教程(三)
查看>>
Git代码托管,SSH不同环境办公
查看>>
老司机 iOS 周报 #58 | 2019-03-11
查看>>
Hystrix问题记录
查看>>
Linux 上ps 命令的使用
查看>>
祛斑用什么产品比较好?简单一步轻松搞定
查看>>
OkHttp发起请求源码阅读(一)
查看>>
复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
查看>>
java spring cloud版b2b2c社交电商-配置中心svn示例和refresh
查看>>