在没有学习重载函数机制之前,在实现不同数据类型的相同操作的时候,还需要重新定义一个函数。例如,实现不同类型的加法函数:
int intAdd(int a, int b);
double doubleAdd(double a, double b);
可以看出来这样实在不方便。C++允许功能相似的函数并且在同一作用域下可以用相同的函数名定义这种机制就叫做重载。函数的重载就是:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,而编译器会根据实参的类型一会个数的最佳匹配,来确定调用哪一个函数。
根据上面的定义可以知道,函数重载必须,形参的类型或者个数不相同。如果函数名相同,形参数据类型和个数相同,无论函数的返回值类型相不相同,都会被认定是语法错误。例如:
//形参类型相同,但个数不同
int add1(int a, int b, int c);
int add1(int a, int b);
//形参个数相同,但类型不同
int add2(int x, int y);
double add2(double a, double b);
//函数不以形参名来区分函数
int add3(int a1, int b1);
int add3(int a2, int b2);//这样就是错误的
//函数不以返回值来区分
int add4(int x, int y);
void add4(int x, int y);//这样也是错误的
另外,除了上面说到的情况,还需要注意的是:具有默认值的形参值得函数在进行函数重载的时候就需要注意防止二义性。例如:
void test(int a, int b = 10, int c = 20);
void test(int b);
当调用test函数的时候,如果传入的参数只有一个整型值,编译器就不知道该调用哪一个函数,这样编译器就会报错。