/*ca69a.cpp_c++_函数匹配(重载确定)
#重载确定的三个步骤
1.候选函数
2.选择可行函数
3.寻找最佳匹配(如果有的话)
#含有多个形参的重载确定
void f1();
void f1(int);
void f1(int,int);
void f1(double,double = 3.14);
f1(5,6) //调用void f1(double,double)
一、确定候选函数和可行函数
函数匹配的第一步是选择本次调用对应的重载函数集,集合中的函数成为候选函数。
候选函数特征:
1、与被调函数的函数同名
2、其声明在调用点可见
在上面的例子中,有4个名为f的候选函数。第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数成为可行函数,可行函数特征:
1、形参数量与本次调用提供的实参数量相等,而是每个实参的类型与对应的形参类型相同,或者能够转化为形参的类型。
2、每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型。
我们能根据实参的数量从候选函数中排除掉两个,无参数和两个int类型参数都不行,而一个int和默认值的两个double类型都是可行的。
二、寻找最佳匹配
函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。在这一过程中,逐一检查函数调用提供的实参。
如果有多个可行函数,那么编译器依次检查每个实参以确定哪个函数是最佳匹配。如果有且只有一个函数满足下列条件,则匹配成功:
· 该函数每个实参的匹配都不劣于其他可行函数需要的匹配
· 至少有一个实参的匹配优于其他可行函数提供的匹配
若无函数脱颖而出,编译器会报错,认为此为二义性调用。
三、实参类型转换
1、精确匹配,包括以下情况:
· 实参类型和形参类型相同
· 实参从数组类型或函数类型转换成对应的指针类型
· 向实参添加顶层const或者从实参中删除顶层const
2、通过const转换成实现的匹配
如果重载函数的区别在于它们引用类型的形参是否引用了const,或者指针类型的形参是否指向const,则当调用发生时编译器通过实参是否为常量来决定哪个函数
txwtech
*/
1 /*ca69a.cpp_c++_函数匹配(重载确定) 2 #重载确定的三个步骤 3 1.候选函数 4 2.选择可行函数 5 3.寻找最佳匹配(如果有的话) 6 #含有多个形参的重载确定 7 8 void f1(); 9 void f1(int); 10 void f1(int,int); 11 void f1(double,double = 3.14); 12 f1(5,6) //调用void f1(double,double) 13 14 一、确定候选函数和可行函数 15 16 函数匹配的第一步是选择本次调用对应的重载函数集,集合中的函数成为候选函数。 17 18 候选函数特征: 19 20 1、与被调函数的函数同名 21 22 2、其声明在调用点可见 23 24 在上面的例子中,有4个名为f的候选函数。第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数成为可行函数,可行函数特征: 25 26 1、形参数量与本次调用提供的实参数量相等,而是每个实参的类型与对应的形参类型相同,或者能够转化为形参的类型。 27 28 2、每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型。 29 30 我们能根据实参的数量从候选函数中排除掉两个,无参数和两个int类型参数都不行,而一个int和默认值的两个double类型都是可行的。 31 32 二、寻找最佳匹配 33 34 函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。在这一过程中,逐一检查函数调用提供的实参。 35 36 如果有多个可行函数,那么编译器依次检查每个实参以确定哪个函数是最佳匹配。如果有且只有一个函数满足下列条件,则匹配成功: 37 38 · 该函数每个实参的匹配都不劣于其他可行函数需要的匹配 39 40 · 至少有一个实参的匹配优于其他可行函数提供的匹配 41 42 若无函数脱颖而出,编译器会报错,认为此为二义性调用。 43 44 三、实参类型转换 45 46 1、精确匹配,包括以下情况: 47 48 · 实参类型和形参类型相同 49 50 · 实参从数组类型或函数类型转换成对应的指针类型 51 52 · 向实参添加顶层const或者从实参中删除顶层const 53 54 2、通过const转换成实现的匹配 55 56 如果重载函数的区别在于它们引用类型的形参是否引用了const,或者指针类型的形参是否指向const,则当调用发生时编译器通过实参是否为常量来决定哪个函数 57 58 txwtech 59 */ 60 #include <iostream> 61 using namespace std; 62 63 void f() 64 { 65 cout << "f()被调用" << endl; 66 } 67 void f(int a) 68 { 69 cout << "f(a)被调用" << endl; 70 } 71 void f(int a, int b) 72 { 73 cout << "f(int a, int b)被调用" << endl; 74 } 75 void f(double a, double b=3.14) 76 { 77 cout << "f(double a, double b=3.14)被调用" << endl; 78 } 79 void g(int a) 80 { 81 cout << " g(int a)被调用" << endl; 82 } 83 84 int main() 85 { 86 f(8); 87 f(5.6);//二个可行函数。f(int a),//f(double a, double b=3.14)是最佳匹配 88 //f(42,2.56); //找不到合适参数进行匹配,存在二义性 89 //f(2.56,88);//找不到合适参数进行匹配,存在二义性 90 91 f(static_cast<double>(42), 5.56);//c++风格,static_cast强制类型转换,42转double 92 f((double)42,5.56);//c风格写法强制类型转换 93 f(12.1,5.6); 94 f(88, static_cast<int>(5.66));//c++风格,static_cast强制类型转换,5.66转int 95 f(88,66); 96 97 return 0; 98 }