計算機程式設計/函式過載
外觀
< 計算機程式設計
函式過載 (也稱為 方法過載) 是一種程式設計概念,允許程式設計師定義具有相同名稱和相同作用域的兩個或多個函式。
每個函式都有一個唯一的簽名(或頭),它源於
- 函式/過程名稱
- 引數數量
- 引數型別
- 引數順序
- 引數名稱
- 返回值型別
請注意:並非所有上述簽名選項在所有程式語言中都可用。
| 語言 | 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”,因為它是在識別符號(名稱)、引數型別和名稱(標籤)以及返回值型別方面唯一匹配的函式。