当我们定义好几个重载函数之后,在函数调用的时候编译器就需要负责找到一个与实参列表最匹配的重载版本。编译器找寻这样一个函数的过程也叫作重载解析(Overload Resolution)。重载解析是一个比较复杂的议题,为了写出更好的重载函数,我们有必要了解一些基本的规则。
首先,编译器在重载解析的过程中最终可能有3种结果:
1.找到与实参最佳匹配的函数。
2.没有找到匹配可用的函数,编译器报错。
3.找到几个匹配的但匹配度不分上下的函数,编译器会报出二义性(Ambiguity)错误。
其次,重载解析的过程也有如下3个步骤:
1.先找到所有当前作用域中可见的重名函数,也叫作候选函数。
2.然后找到参数个数一致,并且参数类型一致或者可以隐式转换的可行函数。
3.最后找到一个最佳匹配函数,匹配度是由有多少参数需要隐式转换来决定的,如果参数都不用转换,那么该函数肯定是最佳匹配函数。
这一系列的步骤可以画成比较直观的决策树图,如图7.5.4所示:
图7.5.4 重载解析的决策树表示
接下来,我们就来看一个可以说明编译器如何匹配函数的示例:
动手写7.5.4
(www.xing528.com)
动手写7.5.4可以用来说明重载解析的过程。首先,main()函数上方的3个函数都可见,而且都可以作为候选函数。由于调用时只有两个参数,第二或第三个版本的函数都可以。又因为实参类型是float,int版本的函数也可以隐式转换,所以第二和第三个版本的函数都是可行函数。最后,由于float版本的函数不需要任何隐式转换,编译器就选择它作为最佳匹配函数了。
在多个参数的情况下很容易出现匹配度一致的情况,这个时候就会出现二义性问题。
动手写7.5.5
动手写7.5.5展示了二义性匹配的情况,编译时会产生如图7.5.5所示的错误:
图7.5.5 二义性
我们可以看到,这个例子中函数的两个实参分别是int和float,所以整型和浮点型的两个版本的函数都要进行一个参数的隐式转换,由于匹配分不出优劣,编译时产生了错误。为了解决这个问题,我们可以显式地将实参转换成我们想要的类型,不管是float转成int,还是int转成float都可以。
动手写7.5.6
动手写7.5.6展示了如何解决二义性匹配。运行结果如图7.5.6所示:
图7.5.6 解决二义性匹配
将整型b强制转换成float之后,重载解析就不会有问题了,程序得以顺利输出运算结果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。