C++primer学习笔记-----6.6函数匹配

本文详细介绍了函数匹配的过程,包括确定候选函数、筛选可行函数及最终选择最匹配的函数。探讨了实参数量大于一时的匹配复杂性,并解释了不同类型的实参类型转换及其匹配等级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

确定候选函数和可行函数

函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具备两个特征:一是与被调用的函数同名,二是其声明在调用点可见

第二步考查本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数。可行函数也有两个特征:一是其可接受的实参数量与本次调用提供的实参数量相等,二是每个实参的类型与对应的形参类型相同,或能转换成形参的类型;(若没找到可行函数,编译器报错:无匹配函数)

第三步是藏可行函数中选择与本次调用最匹配的函数。】


含有多个形参的函数匹配(当实参的数量有两个或以上时,函数匹配比较复杂)

编译器依次检查每个实参以确定哪个函数是最佳匹配,如果有且只有一个函数满足下列条件,则匹配成功:

该函数每个实参的匹配都不劣于其他可行函数需要的匹配至少有一个实参的匹配优于其他可行函数提供的匹配。(优劣是下一节介绍的匹配等级的高低)

如果检查了所有函数之后,没有任何一个函数能够超过其他所有函数,编译器报错:二义性调用。】


6.6.1 实参类型转换


【为了确定最佳匹配,编译器将实参类型到形参类型的转换划分成几个等级

1、精确匹配:

实参类型与形参类型相同;实参从数组类型或函数类型转换成对应的指针类型;向实参添加顶层const 或从实参中删除顶层const。

2、通过const 转换实现的匹配(向实参添加底层const)。

3、通过整形提升(小整形向上提升成int 或unsigned)实现的转变。(即使实参是很小的整数值,有时候也会直接提升为int)

当两个同名函数一个接受int、一个接受short,则仅当传入实参为short 时才调用short,其它类型参数都会提升为int 或unsigned。

4、通过算数转换(算数类型之间的转换)或指针转换(转换为void *)实现的转换。

所有算数类型转换的级别都一样,例如从int 向unsigned 和从int 向double 的转换级别相同;从double 向float 和从double 向long 的转换级别相同。

5、通过类类型转换实现的转化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值