函數基本介紹

在這章中,我們要來介紹在軟體世界中一個非常重要而且基本的概念,也就是函數。雖然說這個概念很基本,但軟體也會在有了函數以後而開始變得複雜,並且產生很多延伸觀念比如說遞迴 recursion、函數多載 function overloading 等等。

但這些都是以後的事,這章我們就先來介紹一下什麼是函數,它是怎麼運作的,以及為什麼我們需要函數吧!

什麼是函數?

在軟體世界中,函數是執行特定任務的一組程式碼模塊。它包含了輸入、輸出、輸出類型、宣告、以及定義。一個簡單的函數大概會長這樣:

int func(int a)    // 函數宣告
{
    // 函數定義
    //...
    return a;    // 輸出
}

在這個例子中,我們的輸入就是變數 a,輸出也是 a,輸出的類型為 int

函數宣告即為第一行 int func(int a) 這是為了要告訴編譯器說:「嘿!我這邊有一個名字叫做 func 的函數噢!」

函數定義則是寫在 {} 內的實際邏輯,定義著這個函數負責怎樣的工作。

函數如何運作?

現在讓我們來看一個簡單的應用:

#include <iostream>

// 計算平方的函數
int square(int num) {
    return num * num;
}

int main() {
    int number = 5;
    int result = square(number); // 呼叫 square 函數
    std::cout << number << " 的平方是 " << result << std::endl;
    return 0;
}

在這個例子中,我們建立了一個叫做 square() 的函數,並將計算平方的算是封裝在這個函數之中。這個函數的輸入是一個叫做 num 的變數,輸出則是這個 num 的平方數。

在程式開始執行後,電腦會先從第 8 行開始執行,執行到第 9 行時,電腦看到一個叫做 square() 的函數。這時候有趣的來了,電腦會在第 9 行放上一個「書籤」,並且去尋找 square() 的函數定義在哪裡,發現函數定義後,電腦才會執行這個函數。在執行完函數後,電腦才會回到剛剛放的「書籤」,並繼續第 10 行的程式碼直到結束。

這個感覺就像是我們讀書讀到一半時,突然需要翻到另外一頁去查找其他資料,我們會在原本的地方放置書籤,直到資料查完後,才會回到原本的那一頁繼續閱讀。

為什麼我們需要函數?

看完上面的例子後,相信你更了解函數了,是不是很簡單呢!那重要的問題來了:為什麼我們會需要函數呢?

其實函數改善了軟體設計的許多層面,比如說

  1. 模塊化:將程式碼分解為更小、可管理的函數,有助於模塊化整個軟體架構還有編寫程式碼過程。每個函數封裝了特定任務,讓程式碼更易於理解和維護。這也有助於團隊合作,因為不同的開發人員可以同時處理不同的函數。
  2. 可重複使用:有了函數後,程式碼可以在程式中的不同位置呼叫相同的程式碼,實現了程式碼的可重用性。這大大減少了冗余,促進了更高效的開發過程。
  3. 抽象化:函數抽象了任務的內部細節。這是什麼意思呢?這代表我們其實只要知道函數的輸入及預期的輸出,我們就可以使用它們。我們並不需要知道它們內部的運作方式。這就好比我們使用電視遙控器並不需要清楚知道它的內部運作方式,只需要知道他可以做到遙控電視就行了!這種分離增強了程式碼的可讀性,減少了潛在的錯誤,也大大提升了軟體開發的效率。

總之,函數是軟體編程中的基本概念,可以實現模塊化、可重複使用和組織良好的程式碼。通過將任務分解為可管理的單元,它們對於程式碼的可讀性、可維護性和效率做出了重要貢獻,同時促進了程式設計中的最佳實踐。