函数重载是指,在同一个作用域中,函数名相同,形参表不同的多个函数称为函数重载。
一、只有返回值不同的函数不能成为函数重载,只要有参数不同就能称为函数重载。
例如:①/*不正确*/
float fun(int x,int y);
int fun(int x ,int y);
②/*正确*/
float fun(int x);
int fun(int x ,int y);
注意:如果有默认参数时重写,可能出现重载失效,且默认参数不改变重载本质。
例如:①/*调用会出错*/
float fun(int x);
int fun(int x ,int y=0);
二、一组特殊的重载比较
①/*不正确,不是函数重载,实际上它两需要同一个函数体*/
int fun(int x); //如果传过来的是一个数,比如2,那么它就是一个常数。
int fun(const int x);
②/*正确,为重载*/
float fun(int &x);
int fun(const int &x);
③/*正确,为重载*/
float fun(int *x);
int fun(const int *x); //实际是个int型的常量,不可以改变*x,指针是可以变的
④/*正确,为重载*/
int fun(int *x);
int fun(int * const x); //为常指针,指向不能改变,所指向的内容可以改变
⑤/*正确,为重载*/
int fun(int * const x);
int fun(const int *x);
说明:常指针、常引用做参数表明该函数不会更新这个参数所指向和所引用的对象,这样在参数传递的过程中,就不会触发拷贝构造函数,
可以提高程序的运行效率。第一个不正确时编译器对参数的处理的时候不知道确切的那个所引起。也就是说只要参数能够明确区分的就能进行重载。
三、另一种特殊情形
①/*如下编译能够通过,但是不能算是函数重载,实际上是一个函数*/
typedef int * pI;
int fun(int *x);
int fun(pI x);
说明:编译器(VC6.0)对重复申明是不管的。只是重复定义是不可以的。
四、重载函数在调用的时候出现二义性。
①/*如下如果不调用函数编译都能够通过,但是不能做函数重载,因为调用有歧义*/
int fun(int x);
int fun(int &x);