【共读Primer】58.[6.5]参数匹配 Page217

一般来说函数的选择是比较明确的事情,因为有着参数类型和参数数量的标准。

但是如果将类型转换和默认参数都加入到重载函数中,这个过程就变的复杂起来。

来看看一下代码:

void f();
void f(int);
void f(int ,int);
void f(double, double = 3.14);

在函数的选择过程中分为两步:

1. 找到当前作用域可见的所有名称相同的函数

2. 找到参数数量相等类型相同或可转换的函数

f(5.6); // 调用 void f(double, double)

那么在一些极端情况下还存在第三部:

3. 寻找最佳匹配

我们知道int和double这两个内置类型是可以进行转化的,所以对上面的函数调用

如果不存在void f(double, double = 3.14), 那么void f(int) 将会被调用 

这里void f(double, double=3.14)就是最佳匹配,

那么我们来看看一个更复杂的情况

f(42, 2.56); // 这个调用完全没有精确的匹配函数,编译器应该如何选择?

我们来编码实际操作一下:

#include <iostream>

void f(){std::cout << "f()" << std::endl;};
void f(int){std::cout << "f(int)" << std::endl;};
void f(int, int){std::cout << "f(int, int)" << std::endl;};
void f(double, double = 3.14){std::cout << "f(double, double = 3.14)" << std::endl;};

int main()
{
    f(5.6);
    f(42, 2.56);
}

对于上面的代码编译情况如下, 意思是编译器也不知道改掉用哪个,两者处于平等位置,没有最优调用

在此类重载的选择上的原则是

1. 每个参数匹配都不劣于其他的函数匹配。

2. 至少有一个参数的匹配优于其他函数

而本次我们写的调用,

针对第一个参数来说f(int, int) 更匹配,但是第二个参数需要做转换。

针对第二个参数来说f(double,double=3.14)更匹配,但是第一个参数需要转换。

所以对于编译器来说两个可行函数的优劣没有区别,无法进行更优选择,则产生二义性错误。

 

#include <iostream>

void f(){std::cout << "f()" << std::endl;};
void f(int){std::cout << "f(int)" << std::endl;};
void f(int, int){std::cout << "f(int, int)" << std::endl;};
void f(double, double = 3.14){std::cout << "f(double, double = 3.14)" << std::endl;};

int main()
{
    f(5.6);
    // f(42, 2.56);
}

本次代码编译运行结果如下:

实参类型转换

而在参数匹配的过程中类型转换也被划分为几个级别:

1. 精确匹配

    以下情形属于精确匹配 :

        a. 实参类型和形参类型相同

        b. 实参从数组类型或函数类型转换成对应的指着那类型

        c. 向实参添加顶层const或者从实参删除顶层const

2. 通过const转换实现的匹配

3. 通过类型提示鞥实现的匹配

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

5. 通过类类型转换实现的匹配

以上的所有情况从上到下的每级的匹配程度低于上一级。

 

在转换过程中,遵循的原则是从小向打的转换

如short和int的两个匹配类型中如果都需要转换,通常会选择int

void ff(int);
void ff(short);
ff('a'); // char提升为int

而在算数类型的转换中并没有高低的区别。

void manip(long);
void manip(float);
manip(3.14); // 调用将产生二义性

const和参数匹配

非const参数可以作为const实参进行传递,但是const实参不能作为非const参数 传递。

所以当一个函数有const和非const两个版本时,那么将根据参数的精确类型来匹配。

否则将可以使用非const实参调用const形参的函数

void lookup(Account &);
void lookup(const Account&);
const Account a;
Account b;

lookup(a);  // 这个参数只能通过lookup(const Account&)来调用    
lookup(b);  // 这个参数两个重载都可以调用,但lookup(Account&)匹配更精确

 

转载于:https://www.cnblogs.com/ChattyKu/p/9625549.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值