C++中的重载函数、重载函数匹配与实参转换

本文详细探讨了C++中的重载函数概念,包括重载的条件、重载函数的匹配步骤以及实参转换的优先级。强调了在设计时避免二义性和类型转换问题的重要性。

<分析>:

一、重载函数:

(1)出现在相同作用域两个函数,如果具有相同的名字而形参表不同,则称为重载函数;

(2)局部声明一个函数则该函数将屏蔽而不是重载最外层作用域中声明的同名函数,在c++中,名字查找发生在类型检查之前,所以只要名字相同便进行屏蔽;

(3)如两个函数的形参表完全相同,但返回类型不同,则第二个声明时错误的;

(4)const形参和非const形参的声明是等价的,因为它们传递参数的方式是相同的,但是这种等价性仅限于非引用形参以及非指针形参;

二、重载函数匹配步骤:

(1)候选函数的确定:与被调函数同名的函数

(2)选择可行函数:在候选函数中,选择可以调用的函数:1)参数个数与被调函数参数个数相等;2)实参类型与形参类型匹配或者可以隐式类型转换;

(3)选择最佳匹配:

         ① 其每个实参匹配都不劣于其他可行函数需要的匹配

         ② 至少有一个实参的匹配优于其他可行函数的匹配。

(4)如果没有存在多个最佳匹配,匹配就有二义性;

三、实参匹配与转换:

(1)实参类型转换的优先降序等级:精确匹配> 整型提升> 标准转换> 类类型转换;

(2)没有一个标准转换会比另一个标准转换匹配更好,char到unsigned char 与char 到double的匹配是一样的;

(3)枚举对象只能用同一个枚举类型或者另外一个枚举对象进行初始化,但枚举对象可以提升为整型传递给函数(至少提升为int型或更大);

(4)当两个类定义了相互转换的时候,A类既可以通过B类的构造函数转换为B类,也可以通过A类的类型转换操作符转换为B类,这种情况下存在歧义,除非显式调用构造函数或者转换操作符函数,使用强制类型转换解决不了歧义,所以尽量避免编写存在隐式转换成对的类;

(5)如果重载集中有两个函数用同一类类型转换函数匹配,则使用转换之后或者转换之前的标准转换序列等级来确定最佳匹配。

(6)如果重载集中有两个函数可以使用不同的类类型转换函数匹配,则认为这两个转换操作一样的好,不管是否需要标准转换。

(7)参数同一个匹配过程中,不能存在多个类类型转换函数匹配,否则会出错;

(8)当同时存在函数模版和普通函数的重载版本时候,他们都可以进行匹配,则普通函数优先。

四、设计时需要注意的地方:

(1)尽量不要定义相互转换的类,容易产生二义性;

(2)尽量避免到内置算术类型的转换,因为这样很容易与操作符的重载函数产生歧义;

(3)如果定义了到内置类型的转换函数,那么尽量不要定义接受内置类型操作符的重载版本;

(4)如果定义了到内置类型的转换函数,那么不要定义多个内置类型的转换函数,尽量让标准类型转换提供到其他内置类型的转换;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值