函数重载(Overload):用同一函数名定义不同的函数,当函数名和不同参数搭配时函数的意义不同。
也就是说,函数重载就是,名字一样,参数不同。参数不同有三种:个数不同、类型不同、顺序不同。形参的名字和返回值相不相同无所谓。
来看看编译器调用重载函数的准则:(看不懂或者觉得晕可以不看)
- 将所有同名函数作为候选者
- 尝试寻找可行的候选函数
- 精确匹配实参
- 通过默认参数能够匹配实参
- 通过默认类型转换匹配实参
- 匹配失败
- 最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
- 无法匹配所有候选者,函数未定义,编译失败。
函数重载的注意事项:
- 重载函数在本质上是相互独立的不同函数(静态链编)。
- 重载函数的函数类型是不同的。
- 函数重载是由函数名和参数列表决定的。
#include "iostream"#includeusing namespace std;void myprintf(int a){ printf("a:%d\n ", a );}void myprintf(double a)//类型不同{ printf("a:%f\n ", a );}void myprintf(char *p, int b)//个数和位置不同{ printf("p:%s, b:%d", p, b);}void myprintf(int b, char *p)//个数不同{ printf("b:%d, p:%s", b, p);}//函数返回类型不是函数重载的判断标准//这里会编译出错int myprintf(int a){ printf("a:%d\n", a);}//当函数重载遇上 函数默认参数int myprintf(int a, int b, int c=0) { printf("a:%d, b:%d c:%d \n", a, b, c); return a;}int main(){ int a = 1; myprintf(a); //调用void myprintf(int a) //myprintf(1,2); //二义性,无法判断是void myprintf(int a, int b)还是int myprintf(int a, int b, int c=0) ,调用失败。 myprintf(1,2,3);//可以区分 return 0;}