函数重载
同一作用域,函数名相同而参数列表不同的函数成为重载函数; ps:main函数不能重载
参数判断
// 以下两个函数没有区别
void func(int x);
void func(int);
// const无法区分参数类型
void func(int x);
void func(const int);
作用域
void func(double);
void func(string);
int main() {
func(3.14); // 合法
func("hello world"); // 合法
void func(int); // 隐藏外层作用域声明的重载函数
func(3.14); // 非法!错误
func("hello world"); // 非法!错误
func(1024); // 合法
}
函数匹配
重载函数
void func();
void func(int);
void func(int, int);
void func(double, double = 3.14);
候选函数
函数选定的原则:先判断函数名,然后再判断参数类型 特征: ①与被调用的函数同名; ②在调用点可见(合法);
可行函数
在匹配过程中,通过候选函数判断选出候选人,然后进行可行性(参数列表)判断 特征: ①参数数目相同; ②参数类型相同或可通过转换;
最佳匹配函数
从可行函数中选取最佳的函数,有且仅有一个可行函数满足以下条件:
①该函数每个实参的匹配都不劣于其他可行函数的匹配;
②至少有一个实参优于其他可行函数的匹配;
若没有唯一满足上述条件的函数,则返回二义性调用错误!
匹配级别-类型转换
1、精准匹配
①实参与形参类型相同
②实参转换为对应类型的指针
③向实参添加顶层const或从实参中删掉顶层const
2、通过const转换的匹配
对于隐式类型转换而言:
// 非常量可以转换为常量
void func(const int &x);
int x = 1024;
// 正确!^v^
func(x);
// 常量不能转换为非常量
void func(int &x);
const int x = 1024;
// 错误!含有隐式类型转换int &x = const int;
func(x);
3、通过类型提升实现的匹配(强制类型转换)
4、通过算数类型转换或指针转换实现的匹配
5、通过类类型转换实现的匹配