计算机编程/函数重载
外观
< 计算机编程
函数重载 (也称为 方法重载) 是一种编程概念,允许程序员定义具有相同名称和相同作用域的两个或多个函数。
每个函数都有一个唯一的签名(或头),它源于
- 函数/过程名称
- 参数数量
- 参数类型
- 参数顺序
- 参数名称
- 返回值类型
请注意:并非所有上述签名选项在所有编程语言中都可用。
语言 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
Ada | 是 | 是 | 是 | 是 | 是 | 是 |
C++ | 是 | 是 | 是 | 是 | 否 | 否 |
Java | 是 | 是 | 是 | 是 | 否 | 否 |
Swift | 是 | 是 | 是 | 是 | 是 | 是 |
警告:函数重载经常与函数覆盖混淆。在函数重载中,创建了一个具有不同签名的函数,添加到可用函数池中。然而,在函数覆盖中,声明了一个具有相同签名的函数,在新的函数上下文中替换了旧的函数。
由于在这种情况下函数的名称相同,我们必须通过更改 参数列表 (最后三个外星人) 中的内容来保持签名的唯一性。
如果函数的签名足够不同,编译器可以区分在每次出现时打算使用哪个函数。这个寻找适当函数的过程被称为 函数解析,它可能相当密集,特别是如果有很多同名函数。
支持隐式类型约定的编程语言通常在没有完全匹配的函数时使用参数提升(即将整数类型转换为浮点数类型)。参数降级很少使用。
当两个或多个函数符合函数解析过程中的标准时,编译器将报告一个 歧义错误。通过编辑源代码(例如使用类型转换)为编译器添加更多信息可以解决此类疑虑。
示例代码展示了如何使用函数重载。由于函数实际上执行相同的操作,因此使用函数重载是有意义的。
function int generateNumber(int MaxValue) { return rand * MaxValue } function int generateNumber(int MinValue, int MaxValue) { return MinValue + rand * (MaxValue - MinValue) }
第一个代码块将生成从 0 到指定参数 MaxValue 的数字。适当的函数调用是
int Number := generateNumber(10);
第二个代码块需要另一个参数 MinValue。函数将返回大于或等于 MinValue 且小于 MaxValue 的数字。
int Number := generateNumber(6, 10);
func doIt(a:Int, b:Int) -> Int {
return a - b
}
func doIt(a:Int, b:Int) -> Double {
return Double(b - a)
}
let a = 7
let b = 8
var c = a + b
c = doIt(a:a, b:b)
print(c)
在这个例子中,常量“a”和“b”被推断为整数,因此变量“c”也是整数。因此,编译器将使用第 1 行的重载函数“doIt”,因为它是在标识符(名称)、参数类型和名称(标签)以及返回值类型方面唯一匹配的函数。