时间:2023-02-08 08:43:00 | 栏目:C代码 | 点击:次
首先,编译器会确定候选函数然后确定可行函数可行函数,再从可行函数中进一步挑选
候选函数:重载函数集中的函数
可行函数:可以调用的函数
最后进行寻找最佳匹配
有以下几种规则
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; }