c++ 函数-函数重载 时 的 函数匹配

c++ 函数-函数匹配

确定候选函数和可行函数

  • 函数匹配地第一步是 选定 本次 调用对应 地重载函数集,集合中的函数 称为候选函数

候选函数 有两个特征:1、与被调函数同名,2、声明在调用点可见

  • 第二步是 考察本次调用 提供的实参,然后从候选函数 选出 这组实参 调用的 函数 ,这些函数 称为可行函数

  • 如果函数 有默认参数,则实参数量可少于 形参数量

void f();
void f(int);
void f(int ,int);
void f(double ,double = 3.14 );
f(3.2);  //调用 第四个

含有多个形参地函数匹配

​ 当实参 地 数量 有两个 或者 更多时,函数匹配就比较复杂了

当调用如下函数会发生什么

f(2,6.28);

该例 中 可行函数 是 f(int,int) , void f(double ,double = 3.14 )

接下来 编译器 依次检查 每个 实参 以确定 那个函数值最佳匹配 如果有且仅有只有一个函数 满足如下连个条件 则直接匹配成功:

  • 该可行函数 每个参数 地匹配都 不劣于 其他可行函数 地匹配
  • 至少有一个参数地匹配时优于 其他可行函数 提供的匹配

如果在这个检查后 没有一个可行函数 脱颖而出 ,则会报错,二义性调用

比如这个例子中就会报错,因为他们半斤八两

实参类型转换

编译器将 实参类型 到形参类型地转换划分为一下几个 等级 具体排序如下:

1、精确匹配 ,包括一下 情况 :

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

2、通过 const 转换 实现地匹配

3、 通过类型 提升 实现匹配

4、通过算术类型 转换 或指针转换 实现的匹配

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

需要 类型 提升和算术类型 转换的匹配

//内置类型的提升和转换 可能 在函数 匹配时产生意想不到 的 结果 

小整数 一般都会提升 到 int 类型 或者更大的整数类型

有时 即使实参 提供得是 一个很小的1整数值,也会直接 将他 提升成 int 类型 此时使用short版本 反而会 导致类型转换

void func(int);
void func(short);
func('a');//char 提升成 int 调用 int 版本 

所有的 算数类型都一样,例如 从 int 向unsugned int 转换并不比 int 向 double 转换的类型搞

例如:

void _f(long);
void _f(float);
void _f(int);
_f(3.14);  //错误 ,二义性 
/*
	字面值 3.14 的类型是 double 他既能转换成 long 也能转换成 float 和int 
*/

函数匹配 和const 实参

如果重载函数 的区别 在于 他们 的引用类型 的形参 是否引用了 const ,或者 指针类型 的形参是否指向const ,

通过下面的例子了解这一点:

Record lookup(Account &);
Record lookup(const Account &);

const Account a;
Account b;

lookup(a);     //调用 Record lookup(const Account &);
lookup(b);     //调用 Record lookup(Account &);

所以 显然 编译器可以 取分这一点

那指针也是一样的 ,同样可以区分;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奥特神龟3.1.4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值