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
*/
/*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
*/
#include <iostream>
using namespace std;
void f()
{
cout << "f()被调用" << endl;
}
void f(int a)
{
cout << "f(a)被调用" << endl;
}
void f(int a, int b)
{
cout << "f(int a, int b)被调用" << endl;
}
void f(double a, double b=3.14)
{
cout << "f(double a, double b=3.14)被调用" << endl;
}
void g(int a)
{
cout << " g(int a)被调用" << endl;
}
int main()
{
f(8);
f(5.6);//二个可行函数。f(int a),//f(double a, double b=3.14)是最佳匹配
//f(42,2.56); //找不到合适参数进行匹配,存在二义性
//f(2.56,88);//找不到合适参数进行匹配,存在二义性
f(static_cast<double>(42), 5.56);//c++风格,static_cast强制类型转换,42转double
f((double)42,5.56);//c风格写法强制类型转换
f(12.1,5.6);
f(88, static_cast<int>(5.66));//c++风格,static_cast强制类型转换,5.66转int
f(88,66);
return 0;
}
下一篇: lintcode反转整数