概念
在同一个类中,两个以上的函数(方法),具有相同的函数(方法)名但是参数列表不同,在编译时,由编译器根据参数的对应关系,自动确定调用哪一个函数,即为重载。其中,参数列表的不同可以时参数类型的不同,也可以是参数的个数不同,亦或是参数的顺序不同。但是,编译器不会通过形参的名称区别形参,形成重载。
重载是可以使函数、运算符等处理不同类型的数据或者接受不同个数的参数的一种方法。从某种意义上理解, 重载相当于我们日常生活中的动词。比如“喝”,既可以表示喝水,也可以表示喝汤,还能表示喝奶,当我们听到 “喝”这个词的时候就会通过对话的语境来判断喝的是什么;同样的道理,当编译器在碰到被重载的函数(方法) 名时,也会根据上下文,即实参的类型或者个数去选择调用某个具体的函数(方法)。
重载的使用
先给出一组标准的重载示例
int add(int x, int y) {
System.out.println("方法 1");
return x + y;
}
int add(int x, int y, int z) {
System.out.println("方法 2");
return x + y + z;
}
double add(double x, double y) {
System.out.println("方法 3");
return x + y;
}
double add(double x, double y, double z) {
System.out.println("方法 4");
return x + y + z;
}
上面的示例中,给出了同名的四个方法,方法名都是add, 但是,是方法的参数列表各不相同。
下面来测试一下这一组重载方法:
public static void main(String[] args) {
OverloadTest test = new OverloadTest();
System.out.println(test.add(1, 3));
System.out.println(test.add(1, 2, 3));
System.out.println(test.add(1.2, 3.2));
System.out.println(test.add(1.2, 2.2, 3.0));
}
运行结果如下:
方法 1
4
方法 2
6
方法 3
4.4
方法 4
6.4
由上面的示例,可以发现,方法的返回类型其实是有所变化的,这并不会影响方法重载。但是,如果两个方法仅仅是返回值有所区别,这并不能构成重载,反而会导致编译错误。
在一段程序中,编写如下两个方法:
double add(double x, double y, double z) {
System.out.println("方法 4");
return x + y + z;
}
int add(double x, double y, double z) {
System.out.println("方法 4");
return x + y + z;
}
编译器错误提示如下:
Duplicate method add(double, double, double) in type OverloadTest
不要将不同功能的函数(方法)声明为重载函数(方法),以免混乱。也就是说,重载的函数(方法)在功能上应该是相近的(比如整型和浮点型数据的各自相加),而不应该把功能完全相反的函数(方法)用重载组合。
int compute(int a,int b){
return a+b;
}
float compute(float a,float b){
return a-b;
}
上面的例子中,一个是对整形数据做加法,一个是对浮点型的数据做减法,这样在项目后期维护的过程中,就是一个噩梦。
当使用具有默认形参值的函数(方法)重载的形式时,需要注意防止二义性。
void fun(int x,int y = 2, int z = 3) {}
void fun(int x) {}
这种带有默认形参的函数声明的用法在C++中广泛存在,应该特别注意。
以上,就是有关函数(方法)重载的相关概念和使用注意事项,供读者参考。