浅谈函数与操作符的重载
重载
- 函数重载
- 操作符重载
函数重载
面向对象编程语言中,如C++、Java经常涉及到函数重载,即使用“同名”函数完成同一类功能
避免了开发者需要起名字或记忆多个API名字这样的问题,对于程序的编写提供了便利
函数签名
函数是通过函数签名区分的
通常函数签名包括函数名和参数表(个数和类型顺序),某些时候可能包含返回值类型和受查异常表
所以参数表不同(包括个数和类型顺序)可以作为函数重载的条件
函数返回值类型不能做为区分条件,因为不能通过返回类型确定所调用的函数
//函数重载示例
int max(int a, int b) {
return a > b ? a : b;
}
double abs(double a, double b) {
return a > b ? a : b;
}
int main() {
printf("%d\n", abs(-1, 2));//调用第一个
printf("%f\n", abs(1.5, -2.5));//调用第二个
printf("%d\n", abs(1, 1.5));//引起歧义,产生编译错误
return 0;
}
那么,在Java中,使用不同类型的泛型集合作为的参数不可作为重载的依据
因为Java中的泛型作用在编译期 Java:泛型
C++与Java函数重载的异同
Java中一个类的函数重载可以在本类中的函数和来自父类中的函数之间进行,而C++类中的函数重载只能是本类中的(即不包括来自父类的函数)。在其他方面的要求都基本一致,即要求函数名称一致,参数不同。
即
- Java的函数重载范围是整个继承体系中的可见函数
- C++中的类中的函数重载的范围只能是当前类中的函数,如果本类中的函数与父类的函数同名,就会隐藏父类相应的函数(不会产生重载的效果)。如果继续使用父类的函数就会编译错误
函数重载的实现
C++中函数重载是通过编译器对函数名的“破坏”(改写)实现,即编译后源代码中的同名函数名字被改变,以区分不同重载函数,调用时根据参数选择恰当的函数进行调用
可在汇编代码中得到证明
Java中的函数重载与字节码在JVM中的处理有关
Java中的方法重载与方法重写
- 重载(overload)方法
对重载方法调用的依据是静态类型,即声明类型,声明类型是什么类型,就调用什么类型的参数方法 - 重写(override)方法
对重写方法调用的依据是动态类型。当前实际类型如果实现了该方法则直接调用该方法,如果没有实现,则在继承关系中从低到高搜索有无实现
可参考多态
操作符重载
操作符重载与函数重载作用类似
- Java不存在操作符重载
String s = "abc";
s += "edf";
此处“+”的功能实际上由StringBuilder实现
- C++支持对已有操作符重载
2020/1/14 更新