函式簡介


到目前為止都只使用一個函式(Function),也就是 main 主函式,若某些程式碼經常使用,可以抽出成為新函式以便重覆呼叫,函式用來將程式組織為一個小的、獨立的運行單元,一個函式可以接受資料,並運行其中的算法,最後將結果傳回。

函式的組成主要包括四個部份:返回值、函式名稱、參數列與函式主體。前三者稱為函式宣告或函式原型(Function prototype),在 C++ 中規定,如果函式是在 main 之後實作,必須在 main 之前進行宣告,否則會出現編譯錯誤。

函式原型定義了函式的外觀,通常定義在獨立的標頭檔,而被含入每個想呼叫函式的檔案中,以下是一個函式宣告的範例:

math.h

int pow2(int); 
int pow(int, int);

如果函式不傳回任何值,則宣告為 void,若不傳入任何引數,參數列保持空白即可,雖然也可以使用 void 來加以註明,不過 void 註明參數列不使用其實是 C 的風格,而在 C++ 中,參數列空白就表示這個函式不接受任何引數。

標頭檔案被儲存為 .h 檔案,接著可以根據函式原型來實作函式主體,例如:

math.cpp

#include "math.h"

int pow2(int num) { 
    return num * num; 
} 

int pow(int n, int p) { 
    int r = 1; 

    for(int i = 0; i < p; i++) {
        r *= n;
    }

    return r; 
}

在含入標頭檔時,若標頭檔與含入標頭檔的文件在同一目錄,就使用雙引號 "" 來包括標頭檔名稱,如果是標準或專案專屬的標頭檔,例如 C++ 的標準表頭檔,那麼使用角括號 <> 來括住,編譯器在尋找時就會從設定的目錄尋找。

接著可以在含入標頭檔後,直接呼叫定義的函式。例如:

main.cpp

#include <iostream>
#include "math.h"
using namespace std;

int main() {
    int num = 0;
    int power = 0; 

    cout << "輸入數值:"; 
    cin >> num; 

    cout << "輸入次方:"; 
    cin >> power; 

    cout << num << " 平方:" << pow2(num) << endl
         << num << " 的 " << power << " 次方:" 
         << pow(num, power) 
         << endl; 

    return 0;
}

執行結果:

輸入數值:10
輸入次方:2
10 平方:100
10 的 2 次方:100

在編譯時期,編譯器會檢查被呼叫的函式,若無法根據函式名稱、提供的引數型態與函式宣告上參數型態來決定被呼叫的函式,會出現編譯錯誤,這就是必須先作函式宣告的原因,這對編譯器的檢查工作是必要的資料,手動編譯指令的方式如下:

g++ -c math.cpp -o math.o
g++ -c main.cpp -o main.o
g++ math.o main.o -o main.exe