ca69a.cpp_c++_函数匹配(重载确定)

/*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 }
欢迎讨论,相互学习。 txwtech@163.com
原文地址:https://www.cnblogs.com/txwtech/p/12287416.html