同一作用域,函数名相同而参数列表不同的函数成为重载函数;
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、通过类类型转换实现的匹配