首页 理论教育C++基础教程:函数调用匹配顺序

C++基础教程:函数调用匹配顺序

【摘要】:当一个实际的函数调用,它既可以和一个重载函数相匹配或是参数转换后与某一重载函数相匹配,又可以与某一模板函数相匹配,这并不会产生二义性。只是调用哪一个需按照一定的规则安排先后次序。在失败后,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若找到了,就调用它。

当一个实际的函数调用,它既可以和一个重载函数相匹配或是参数转换后与某一重载函数相匹配,又可以与某一模板函数相匹配,这并不会产生二义性。只是调用哪一个需按照一定的规则安排先后次序。这些规则就是函数模板与同名的非模板函数的重载方法均遵循的约定:

(1)寻找一个参数完全匹配的函数,如果找到了就调用它。

(2)在(1)失败后,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若找到了,就调用它。

(3)在(1)、(2)均失败后,再试一试低一级的函数的重载方法,例如通过类型转换可产生参数匹配等,若找到了,就调用它。

(4)若以上均失败,则就是一个错误的调用。

【例5.6】分析以下程序的执行结果。

解:程序的执行结果如下:

int重载函数:max=12

int重载函数:max=51(www.chuimin.cn)

char重载函数:max=c

int重载函数:max=d

模板函数:max=22.45

在语句①中调用max(i1,i2),由于两个参数均为int型,按照上述规则,首先查找完全匹配的函数调用,找到了,因此调用intmax(int x,int y,int z=0)重载版本。

在语句②中调用max(i1,i2,i3),由于三个参数均为int型,按照上述规则,首先查找全匹配的函数调用,找到了,因此调用intmax(int x,int y,int z=0)重载版本。

在语句③中调用max(c1,c2),由于两个参数均为char型,按照上述规则,首先查找完全匹配的函数调用,找到了,因此调用charmax(char x,char y)重载版本。

在语句④中调用max(c1,c2,c3),由于三个参数均为char型,按照上述规则,首先查找完全匹配的函数调用,没有找到,再找函数模板,也没有找到,因此调用经过类型转换的intmax(int x,int y,int z=0)重载版本。

在语句⑤中调用max(f1,f2),由于两个参数均为double型,按照上述规则,首先查找完全匹配的函数调用,没有找到,再找函数模板,找到了,因此调用函数模板实例化的模板函数doublemax(double x,double y)版本。