简介
==========================================================================================================================================
一、函数匹配
1、函数匹配
函数重载确定(函数匹配)是将函数调用与重载函数集合中的一个函数相关联的过程。通过自动提取函数调用中实际使用的实参与重载集合中各个函数提供的形参做比较,编译器实现该调用与函数的匹配。匹配结果有三种可能:
编译器找到与实参最佳匹配的函数,并生成调用该函数的代码;
找不到形参与函数调用的实参匹配的函数,在这种情况下,编译器将给出编译错误信息;
找到多个与实参匹配的函数,但没有一个是明显的最佳选择。这种情况也是错误的,该调用具有二义性。
大多数情况下,编译器都可以直接明确地判断一个实际的调用是否合法,如果合法,则应该调用哪一个函数。重载集合中的函数通常有不同个数的参数或无关联的参数类型。当多个函数的形参具有可通过隐式转换关联起来的类型,则函数匹配将相对灵活。这种情况下,需要程序员充分地掌握函数匹配的过程。
二、重载确定的三个步骤
void f();
void f(int);
void f(int,int);
void f(double,double =3.14);
f(5.6);// 调用函数void f(double,double);
1、候选函数—-函数重载第一步
- 函数重载确定的第一步是确定该调用所考虑的重载函数集合,该集合中的函数称为候选函数。候选函数是与被调函数同名的函数,并且在调用点上,它的声明可见。上述例子有四个名为 f 的候选函数。
2、选择可行函数—-函数重载第二步
- 第二步是从候选函数中选择一个或多个函数,它们能够用该调用中指定的实参来调用。因此,选出来的函数称为可行函数。
可行函数必须满足两个条件:
第一,函数的形参个数与该调用的实参个数相同;
第二,每一个实参的类型必须与对应形参的类型匹配,或者可被隐式转换为对应的形参类型。
第三,如果函数具有默认实参,则调用该函数时,所用的实参可能比实际需要的少,默认实参也是实参,在函数匹配过程中,它的处理方式与其他实参一样。
根据实参个数选出潜在的可行函数后,必须检查实参的类型是否与对应的形参类型匹配。所谓的类型匹配要么精确匹配,要么实参类型能够转换为形参类型。
f (int) 是一个可行函数,因为通过隐式转换可以将函数调用中的double型实参转换为该函数唯一的int型形参;
f(double,double) 也是一个可行函数,因为该函数为其第二个形参提供了默认实参,而且第一个形参是double类型,与实参类型精确匹配;
3、寻找最佳匹配(如果有的话)—-函数重载第三步
- 函数重载确定的第三部是确定与函数调用中使用的实际参数匹配最佳的可行函数,这个过程考虑函数调用中的每一个实参,选择对应形参与之最匹配的一个或多个可行函数。”最佳“ 的原则是实参类型与形参类型越接近则匹配越佳。完全匹配比需要转换的匹配好。
4、含有多个形参的重载确定—-函数重载第四步
如果函数调用使用了两个或两个以上的显示实参,则函数匹配会更加复杂。假设有同样的名为 f 的函数,分析下面的函数调用:
f (42 , 2.56);
编译器首先选出形参个数与类型都与实参匹配的函数。本例中是 f(int,int), f(double,double )。
。。。。。。。。。。。。。。。。