首先,编译器会确定候选函数然后确定可行函数可行函数,再从可行函数中进一步挑选
候选函数:重载函数集中的函数
可行函数:可以调用的函数
最后进行寻找最佳匹配
有以下几种规则
1.该函数的每个实参的匹配都不劣于其他可行函数
2.至少有一个实参的匹配优于其他可行函数的匹配
3.满足上面两种要求的函数有且只有一个
如果上面三个要求都没满足,则出现二义性
一些演示
各有一个精确匹配的实参,编译器报错,不满足条件3
error
void func(int a,int b)
{
cout << "(int,int)" << endl;
}
void func(double a, double b = 3.14)
{
cout <<"(double,double = 3.14)" << endl;
}
int main()
{
func(2.3,5);
}
调用函数类型转换优先级,依次递减
1.精确匹配
包含三种
(1)实参形参类型匹配
(2)从数组或者函数转到对应的指针
(3)添加或者删除顶层const
2.通过const转换实现匹配
3.通过类型提升匹配
4.通过算术类型转换或者指针转换的匹配
5.通过类 类型转换实现的匹配
小整形一般提升为int或者long,即便他的面量很小
void func(int a)
{
cout << "(int)" << endl;
}
void func(short a)
{
cout << "(short)" << endl;
}
int main()
{
func(12);
func('a');
}
运行结果
所有算数类型级别转换都一样
error
void func(double a)
{
cout << "(double)" << endl;
}
void func(float a)
{
cout << "(float)" << endl;
}
int main()
{
func(3.14);
}
不能重载const 和非const两个版本,但是引用可以
关于引用:非const可以升级为const,但是const不能降级为非const
若有两种版本——const and not const,会根据传入的参数自动匹配
void func(const int &a)
{
cout << "(const int&)" << endl;
}
void func(int &a)
{
cout << "(int&)" << endl;
}
int main()
{
const int a = 3;
int b = 4;
func(a);
func(b);
func(5);
}
运行结果
指针的情况于引用类似:
如果两个函数唯一的区别是他们指向的对象是常量或非常量,则编译器根据实参选择函数。
演示
void func(const int *a)
{
cout << "(const int *)" << endl;
}
void func(int *)
{
cout << "(int *)" << endl;
}
int main()
{
int a = 3;
int *pa = &a;
const int *c_pa = &a;
const int b = 4;
const int *pb = &b;
func(pa);
func(c_pa);
func(pb);
}
运行结果
上面提到过的一些重载
using namespace std;
void func(int a)
{
cout << "(int)" << endl;
}
void func(double a)
{
cout << "(double)" << endl;
}
void func(int a,int b)
{
cout << "(int,int)" << endl;
}
void func(double a, double b = 3.14)
{
cout <<"(double,double = 3.14)" << endl;
}
void func(short a)
{
cout << "(short)" << endl;
}
void func(float a)
{
cout << "(float)" << endl;
}
void func(const int &a)
{
cout << "(const int&)" << endl;
}
void func(int &a)
{
cout << "(int&)" << endl;
}
void func(const int *a)
{
cout << "(const int *)" << endl;
}
void func(int *)
{
cout << "(int *)" << endl;
}
到此这篇关于C++中函数匹配机制详解的文章就介绍到这了,更多相关C++函数匹配内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!