介紹完迴圈架構之後,我想是時候可以先介紹一下函式(Function),函式可以說是程式語言中重要的角色之一,好的工程師就要能設計好的函式,並且活用設計原理。
那麼什麼是函式呢? 它又有甚麼用途呢? 首先,函式可以讓我們將一段程式碼用一個名稱把它包裝起來,當我們需要的時候,可以隨時隨地去使用這個函式去執行它,這樣便可以大大地減少重複的程式碼,讓整體程式碼可以看起來更簡便、更容易理解。而這個包裝名稱也就是函式名稱,在業內可能會稱之為API或直接叫Function。
那麼要如何包裝一段程式碼呢? 我們先來看看下面的基本架構:
{return data type} {function name} ( arguments )
{
// do something ...
}
函式定義的開頭return data type,是指這段被包裝的程式碼最後會回傳什麼樣的資料類型,例如它是一段數字計算的程式碼,最後會回傳計算完成之後的整數,那麼就可以定義為 int。
而 function name 函式名稱就看設計者如何命名,但有個限制是不能以數字作為開頭。
再來最後就是 arguments 參數,表示這段被包裝的程式碼需要引用了哪些變數來做計算處理。
我們可以來看看一個簡單的範例,假設有一個函式是負責將兩個變數相加,那麼可能會是如下:
int add (int a, int b) {
int c = a + b;
return c;
}
int add (int a, int b) {
return a + b;
}
考慮上面的兩個例子,我們定義了一個函式叫做add,且也定義了它會回傳 int 的資料型態,並且需要兩個 int a 和 b 參數來做計算,最後用 return (回傳)關鍵字將最後計算結果丟回給呼叫處。
兩個例子的差異只在於有使用區域變數 int c 與否,其餘都是相同的。看看實際調用函式是如何撰寫的,如下:
int add (int a, int b) {
return a + b;
}
int main () {
int a = 1, b = 2;
int c = add(a, b);
cout << "c = " << c << endl;
}
我們在主程式區塊內宣告了兩個變數分別是 a 和 b ,並且都賦予它們的初始值,然後調用了 add 函式,並且將結果用 int c 去接收回傳值。
這樣就完成了一個很基本的函式調用,而像上述的例子,事實上我們也可以不用先宣告變數a和b,而是直接丟數字給函式 add 也是可以的,如下:
int add (int a, int b) {
return a + b;
}
int main () {
int c = add(1, 2);
cout << "c = " << c << endl;
}
如果確定了變數 a 和 b 在接下來是不會用到的變數,那麼就可以寫成像上面的例子。以上面的例子的目的來說,我們只要輸出打印 add 的結果的話, 甚至還可以寫成如下更精簡的樣子:
int add (int a, int b) {
return a + b;
}
int main () {
cout << "c = " << add(1, 2) << endl;
}
像上面的範例就是只有函式定義,而沒有函式的實現(或稱實作)。這樣的用途在於程式由上到下執行時,可以先知道程式碼內文有哪些函式可以調用, 如上面的例子,若我們將 add 函式定義和實作擺在比被調用函式的地方還下面時,在編譯時就會出現錯誤。
函式有幾個要特別注意的幾件事情,如下:
函式回傳值的資料型態,在上面的例子中,讀者應該可以聯想到在初學C/C++ 第四課 - 資料型態介紹到的變數型態。 沒錯,確實函式回傳值除了可以有變數的資料型態之外,還有一些稍微較特別的種類,後續教學會再提到,統整如下表:
回傳值型態 | 說明 |
---|---|
int | 回傳整數 |
char | 回傳字元 |
string | 回傳字串 |
float | 回傳單精確度浮點數 |
double | 回傳雙精確度浮點數 |
bool | 回傳布林值 |
void | 不回傳任何值 |
class or struct | 回傳類別或結構 |
pointer | 回傳任意資料類型的指標 |
Last updated: