最新要闻
- 环球信息:让老人暖胃更暖心
- 天天即时:两倍性能提升!玩家推测PS5 Pro详细配置
- 史上第一次 美国要强制规定航空公司取消或者延误时现金赔偿旅客
- 印度一只老虎杀死花豹 但却不吃肉:原因有二
- 建议买SD卡!《塞尔达传说:王国之泪》容量达16.3GB
- 环球消息!拒绝流氓应用 Win11安卓子系统重磅升级 安全自有一套
- 怀卡托大学学费_怀卡托大学-全球新资讯
- 茂名西站_关于茂名西站的简介
- 冬至是国家法定假期吗_冬至是国家法定假日-每日焦点
- 土豪该有的OLED电竞装备 AOC 2K240Hz显示器6949元(0.01ms响应)
- 情侣吵架从8楼将萨摩耶扔下 后续来了:男主高空抛物被抓
- 女子车位被女邻居霸停数月:一怒之下 直接焊死_全球今日讯
- 全球快资讯丨古力娜扎COS《王者荣耀》貂蝉 美丽动人超越原作
- 传音控股:数字人系统顺利通过全部48个测试项|天天播报
- 【天天播资讯】《羊了个羊》被通报:涉欺骗误导强迫用户!曾被吐槽广告多
- 哈尔滨拆承重墙高楼现新裂缝 专家:或能加固到原状态 成本较高
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
88.函数指针
函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如:
//比较两个string对象的长度bool lengthCompare(const string&, const string&);
该函数的类型是bool(const string&, const string&)。 要想声明一个可以指向该函数的指针,只需要用指针替换函数名即可:
//pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型bool (*pf)(const string&, const string&);//未初始化
从我们声明的名字开始观察,pf前面有个*,因此pf是指针;右侧是形参列表,表示pf 指向的是函数,再观察左侧,发现函数的返回类型是布尔值。因此,pf就是一个指向函数的指针,其中该函数的参数是两个const string的引用,返回值是bool类型。
(资料图片)
*pf两端的括号必不可少。如果不写这对括号,则pf是一个返回值为bool指针的函数://声明一个名为pf的函数,该函数返回bool*bool *pf(const string&, const string&);
1.使用函数指针
当我们把函数名作为一个值使用时,该函数自动地转换成指针。例如,按照如下形式我们可以将lengthCompare的地址赋给pf:
pf = lengthCompare;//pf指向名为lengthCompare的函数 pf = &lengthCompare;//等价的赋值语句:取地址符是可选的
此外,我们还能直接使用指向函数的指针调用该函数,无须提前解引用指针:
bool bl = pf("hello", "goodbye");//调用lengthCompare函数 bool b2 = (*pf)("hello", "goodbye");//一个等价的调用 bool b3 = lengthCompare("hello", "goodbye");//另一个等价的调用
在指向不同函数类型的指针间不存在转换规则。但是和往常一样,我们可以为函数指针赋个nullptr(参见2.3.2节,第48页)或者值为0的整型常量表达式,表示该指针没有指向任何一个函数:
string::size_type sumLength(const string&, const string&);bool cstringCompare(const char*, const char*); pf = 0;//正确:pf不指向任何函数 pf = sumLength;//错误:返回类型不匹配pf = cstringCompare;//错误:形参类型不匹配 pf = lengthCompare;//正确:函数和指针的类型精确匹配
2.重载函数的指针
当我们使用重载函数时,上下文必须清晰地界定到底应该选用哪个函数。如果定义了指向重载函数的指针
void ff(int*); void ff(unsigned int); void (*pf1)(unsigned int) = ff; //pf1指向ff(unsigned)
编译器通过指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配
void (*pf2)(int) = ff;//错误:没有任何一个ff与该形参列表匹配 double (*pf3)(int*) = ff;//错误:ff和pf3的返回类型不匹配
3.函数指针形参
和数组类似(参见6.2.4节,第193页),虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。此时,形参看起来是函数类型,实际上却是当成指针使用:
//第三个形参是函数类型,它会自动地转换成指向函数的指针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);
正如useBigger的声明语句所示,直接使用函数指针类型显得冗长而烦琐。类型别名(参见2.5.1节,第60页)和decltype(参见2.5.3节,第62页)能让我们简化使用了函数指针的代码:
//Fune和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;//等价的类型
我们使用typedef定义自己的类型。Fune和Func2是函数类型,而FuncP和FuncP2是指针类型。需要注意的是,decltype返回函数类型,此时不会将函数类型自动转换成指针类型。因为decltype的结果是函数类型,所以只有在结果前面加上*才能得到指针。可以使用如下的形式重新声明useBigger:
//useBigger的等价声明,其中使用了类型别名void useBigger(const string&, const string&, Fun);void useBigger(const string&, const string&, FuncP2);
这两个声明语句声明的是同一个函数,在第一条语句中,编译器自动地将Fun表示的函 数类型转换成指针。
4.返回指向函数的指针
和数组类似(参见6.3.3节, 第205页),虽然不能返回一个函数,但是能返回指向函数类型的指针。然而,我们必须把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理。与往常一样,要想声明一个返回函数指针的函数,最简单的办法是使用类型别名:
using F = int (int*, int);//F是函数类型,不是指针 using PF = int(*) (int*, int);//PF是指针类型
其中我们使用类型别名(参见2.5.1节,第60贞)将F定义成函数类型,将PF定义成指向函数类型的指针。必须时刻注意的是,和函数类型的形参不一样,返回类型不会自动地转换成指针。我们必须显式地将返回类型指定为指针:
PF f1(int);//正确:PF是指向函数的指针,fl返回指向函数的指针F f1(int);//错误:F是函数类型,f1不能返回一个函数F *f1(int);//正确:显式地指定返回类型是指向函数的指针
当然,我们也能用下面的形式直接声明f1:
int (*fl (int))(int*, int);
按照由内向外的顺序阅读这条声明语句:我们看到fl有形参列表,所以f1是个函数:f1前面有*f1,所以fl返回一个指针:进一步观察发现,指针的类型本身也包含形参列表,因此指针指向函数,该函数的返回类型是int。 出于完整性的考虑,有必要提醒读者我们还可以使用尾置返回类型的方式(参见6.3.3 节, 第206页)声明一个返回函数指针的函数:
auto f1 (int) -> int (*) (int*, int);
5.将 auto 和 decltype 用于函数指针类型
如果我们明确知道返回的函数是哪一个,就能使用decltype简化书写函数指针返回类型的过程。例如假定有两个函数,它们的返回类型都是string::size_type,并且各有两个const string&类型的形参,此时我们可以编写第三个函数,它接受一个string类型的参数,返回一个指针,该指针指向前两个函数中的一个:
string::size_type sumLength(const string&, const string&); string::size_type largerLength(const string&, const string&); //根据其形参的取值,getFcn函数返回指向sumLength或者largerLength的指针decltype(sumLength) *getFcn(const string&);
声明getFcn唯一需要注意的地方是,牢记当我们将decltype作用于某个函数时,它返回函数类型而非指针类型。因此,我们显式地加上*以表明我们需要返回指针,而非函数本身。
参考资料:
C++ Primer
关键词:
88.函数指针
环球信息:让老人暖胃更暖心
天天即时:两倍性能提升!玩家推测PS5 Pro详细配置
史上第一次 美国要强制规定航空公司取消或者延误时现金赔偿旅客
印度一只老虎杀死花豹 但却不吃肉:原因有二
建议买SD卡!《塞尔达传说:王国之泪》容量达16.3GB
环球消息!拒绝流氓应用 Win11安卓子系统重磅升级 安全自有一套
怀卡托大学学费_怀卡托大学-全球新资讯
茂名西站_关于茂名西站的简介
冬至是国家法定假期吗_冬至是国家法定假日-每日焦点
网络基础 登录对接CAS-跨域导致的一个意想不到的Bug
土豪该有的OLED电竞装备 AOC 2K240Hz显示器6949元(0.01ms响应)
情侣吵架从8楼将萨摩耶扔下 后续来了:男主高空抛物被抓
女子车位被女邻居霸停数月:一怒之下 直接焊死_全球今日讯
全球快资讯丨古力娜扎COS《王者荣耀》貂蝉 美丽动人超越原作
传音控股:数字人系统顺利通过全部48个测试项|天天播报
谈一谈如何使用etcd中的事务以及自己的理解
Ansible快速入门(下)
@RequestParam注解参数-世界热讯
【天天播资讯】《羊了个羊》被通报:涉欺骗误导强迫用户!曾被吐槽广告多
哈尔滨拆承重墙高楼现新裂缝 专家:或能加固到原状态 成本较高
谢谢你们,让我们的延吉之行更有意义|全球速读
87.特殊用途语言特性
20天学会 java
讯息:发挥工业互联网平台立体化赋能作用!山东“数字强省”再加速
马斯克曾发出人口消失警告 日本912万65岁以上老人仍在工作 热推荐
RTX 2080S实机运行《GTA6》画面曝光: 熟悉的味道
天天头条:线下大牌:CariaKnar内衣旗舰店男士6条装内裤39.9元
搭载麒麟710A!华为nova 8 SE官方二手机上架:999元
耗时5个月:中国空间站有了新发现 当前讯息
使用 HTTP/2 加速 Node.js 应用
世界要闻:MockMVC的使用
世界头条:辽宁:延续实施社会保险费惠企减负政策
天天热推荐:“最强法务部”出手维权:安卓Switch模拟器Skyline宣布停止开发
索尼PS5 Slim/Pro详细配置曝光:性能翻番了!
特斯拉率先涨价 电动车价格战没戏了?“白色石油”碳酸锂价格重回20万/吨以上
深蹲后开始起跳!长城汽车4月销量超9.3万辆 同比大涨73% 全球视讯
担心的事情发生了!男子庆祝离婚去蹦极绳子断裂:脖子腰椎全摔断_全球快播
度小满发布2022ESG报告:践行ESG发展理念助推可持续发展_视点
vue中手动清除KeepAlive缓存|环球视讯
【世界快播报】钉钉PC端使用 Blazor WebAssembly 读取用户信息
环球视点!财报解析 | 2022年上汽扣非净利跌破百亿 上汽乘用车盈利仍承压
西藏航空回应客机机舱内出现浓烟返航:空调组件故障 安全没影响
全球速看:21金维他维生素C片60粒9.9元抄底:立减50元
杰克辣条再开直播虐猫?人民网怒批:处刑式虐猫可憎 向人类良知挑战
砸掉承重墙 全楼无家可归 损失1.6亿!最多可判刑7年
【世界聚看点】印度:所有智能手机必须标配FM收音机 默认开启
蕙兰怎么养才好_蕙兰怎么养
全球球精选!记录--极致舒适的Vue页面保活方案
世界热头条丨云图说|图解制品仓库CodeArts Artifact
国家医保局:一季度基本医疗保险基金整体运行平稳
iPhone 15 Pro Max影像升级巨大!苹果这次硬刚安卓_动态焦点
观察:显卡散热疯了!背板上装风扇、热管:实测根本没用
买特斯拉等车更省了 上海:6月30日前购买纯电动车补贴1万
中国央行连续6个月增持黄金:这是啥意思? 新动态
当前速读:女子霸占车位拒绝挪车 业主怒将车位焊上 律师:虽有不当但不违法
世界最新:肃南:按下项目建设“快进键”
读书笔记丨理解和学习事务,让你更好地融入云原生时代
第二章-Java程序的设计环境
Python第三方库安装教程、什么是第三方库_全球消息
AI来势汹汹,这份「生存计划」请查收!|世界实时
商品日报(5月8日):商品市场情绪回暖 双焦大涨超6%豆一涨超5%
《护心》雁回人物解析 《护心》雁回是好人还是坏人_当前通讯
每日消息!阿汤哥开战机为英国王送祝福:你可以当我的僚机
淘宝发布“时光机”:可查看20年消费数据 你一共花了多少钱?
赔钱卖车?福特电动车业务巨亏 卖一辆车亏40万元 微头条
摆脱依赖美国GPS!日本计划大幅强化自家准天顶导航系统:卫星从4颗增至11颗
拉萨一路口红绿灯只有3秒?“飙车”才能过 已延长至15秒
嫁入高门的女人百度云 嫁入高门的女人-天天快资讯
昇腾实战丨DVPP媒体数据处理视频解码问题案例
记一次springboot项目漏洞挖掘 全球观速讯
微资讯!科创板收盘播报:科创50指数涨0.77% 软件股显著回暖
奇瑞QQ冰淇淋的智能化驾驶 可坡道起步、动力随心
【环球聚看点】马斯克否认家里有矿:不是富二代而是白手起家
挑战千元旗舰耳机!真我Buds Air5 Pro行业首发50dB降噪
怎么用手机更健康?专家:正常光照下建议亮度控制在50%、距离50cm 天天亮点
巴菲特将AI比作原子弹:将会改变一切
网友的iPhone 14 Pro Max烧屏!苹果售后反馈“屏幕没问题”|动态焦点
客所思s10 客所思控制面板下载s10 环球最资讯
天天观点:Linux基础18 磁盘介绍, 结构, 磁盘分区Fdisk
Marked.js让您的文档编辑更加轻松自如-环球报资讯
Kerberos协议原理 全球时讯
验证码短信 API 接入指南:Java 语言示例代码 天天新消息
Tcl/Tk教程_编程入门自学教程_菜鸟教程-免费教程分享_世界观速讯
iPhone 16 Pro将采用固态按键:还有屏下Face ID!|世界今头条
咋想的?一住户小区花园内放生蟑螂 专家:病菌宿主可传播疾病_天天通讯
即时:餐馆有机花菜无认证遭索赔500元 正当维权还是恶意索赔?
全国首例超长矸石充填开采工作面在山能鲁西矿业新巨龙公司“上线”
关于Kubernetes-v1.23.6-master节点的初始化操作|全球播报
WEB中间件常见漏洞总结 当前通讯
企业短信遭疯狂盗用,可能是没配置验证码_当前报道
[webrtc 入门系列] centos搭建coturn服务器 当前播报
欧普康视:目前OK镜没有涉及到AIGC技术_今日关注
《小美人鱼》正片片段曝光:黑小美人鱼海底一展歌喉 天天滚动
全球今日讯!漫威影史最高分电影 《银河护卫队3》票房破2亿
俞敏洪谈为什么大量孩子失去好奇心:中国填鸭式教育、老师引导等造成 每日热点
世界消息!kingbase之ksql命令工具
【Issues】axios如何获取responseType为blob的请求的错误信息 环球时讯
浙江风彩网福彩双色球走势图_浙江风彩网 环球资讯
环球微速讯:一秒充一公里!华为全液冷超充架构全球首测:小鹏发去感谢信