为什么C++要使用函数重载?
在c语言中,没有函数重载,相同功能的函数,可能形参的类型不同就要重新写另一个函数。
int max_int(int a, int b) {
return a > b ? a : b;
}
double max_double(double a, int b) {
return a > b ? a : b;
}
在C++中,如果多个函数功能相同,但
- 参数的类型不同
- 参数的数量不同
- 参数的顺序不同(参数类型不一致)
这时就可以使用重载函数,多个函数拥有一样的函数名。便于函数的管理。
note:函数的返回值不作为函数重载的条件。也就是说两个函数的参数类型和数量完全一致,且顺序相同时,返回值类型不同的话,不能使用相同的函数名。因为程序在汇编时,会将函数名(符号)和其所在的地址形成映射关系,在链接的时候可以更快地根据函数名找到函数所在的地址,存放这种关系的是符号表。而在函数在符号表中的符号遵循一套命名规则:函数符号 = _Z + 函数名长度 + 函数名 + 参数列表类型的缩写。
这些函数接收的形参的类型不同,但是功能是一样的,调用这个函数时,编译器就会根据所传类型自动推导要调用的函数,先是编译,后再去链接对应的函数。这个给过程成为重载决策。重载决策是一个有趣的问题。
编译器将实参类型到形参类型的转换划分为几个等级,排序如下:
- 精确匹配,包括:
- 实参类型和形参类型相同
- 实参从数组类型或函数类型转换成对应的指针类型
- 向实参添加顶层const或从实参中删除顶层const
- 通过const转换实现的匹配
- 通过类型提升实现的匹配
- 通过算术类型转换或指针转换实现的匹配
- 通过类的类型转换实现的匹配
note:顶层const(指针常量) 底层const(指向常量的指针)