開啟章節選單
參數傳遞
極為常見最小化參數傳遞
首先函式通常只會用在特定用途,因此在撰寫之前需要釐清一些事情,才能更順利地寫出一個好的函式。我們拿上一章的程式做舉例,我們想要撰寫一個函式來顯示 hi APCS 後面跟上一個品牌名稱。在這個例子中,不論函式怎麼執行 hi APCS 這個語句都是恆存在的,所以在設計傳遞的參數時就不必考慮。一個好的函式應該只完成一件事,並且在完成目的的前提下最小化參數傳遞的數量。
void apcs(string); int main() { apcs("Guide"); } void apcs(string s) { cout << "Hi APCS" + s; }
區域變數傳遞
在之前變數的章節我們已經討論過變數作用域,而函式中宣告的變數是屬於區域變數。也就是說所有函式宣告的變數離開函式後就不復存在,同時函式也不能讀取其他的區域變數,包含 main 函式,一切的參數傳遞只能透過參數傳遞跟全域變數來處理。
在 APCS 考試中大部情況我們會選擇全域變數來記錄資訊,但真正在職場則多使用參數傳遞。作為新手考試時通常不趕時間,使用參數傳遞的正規寫法可以減少出 bug 的機率,增加程式的可讀核可維護性。
void apcs(string); int main() { apcs("Guide"); // 傳遞的參數 } void apcs(string s) { // 用來接收字串的區域變數s cout << "Hi APCS" + s; }
在這個例子中我們只有傳送唯一參數字串。傳遞的寫法是在要呼叫函式的位置寫下函式名稱,後面帶上一個小括號,括號中傳送要傳遞進函式的數值。接著程式就會開始執行函式,且會將傳遞進來的參數用區域變數來接收。
注意:所有參數傳遞順序都要正確,不可以任意調換,也不能不傳遞。
多參數傳遞
前面的範例中我們只有傳遞一個參數,但函式其實可以一次傳遞多個參數。在這個例子中我們想要寫一個函式來計算兩個數字的和,這時候我們就需要傳遞兩個參數進函式:
void add(int a, int b) { cout << a + b << endl; } int main() { add(1, 2); // 輸出 3 }
當然,你也可以傳遞不同型態或者更多的參數進函式:
void add(int a, int b, string s) { cout << s << " " << a + b << endl; } int main() { add(1, 2, "value:"); // 輸出 value: 3 }
傳參考
在上面這些範例中,編譯器在傳遞參數進函式時會進行數值複製,因此變更的都是在副本的區域變數,並不會直接更改原本的變數。然而如果像是陣列等大數據資料,每次呼叫都要進行複製會犧牲掉很多效能,因此有一種特別的寫法可以解決。
void apcs(string &); int main(){ string x = "Guide"; apcs(x); } void apcs(string &s) { cout << "Hi APCS" + s; }
上面這個方法叫做傳參考,他只需要在變數名稱前面加上「&」就可以了。這種方法不會複製變數,而是直接將原本的變數取一個別名,實際上是在操作同一個記憶體位置上的同個變數。不過既然是同一個變數,修改時當然也會影響到原本的變數:
void apcs(string &s) { s = "Guide"; } int main(){ string x = "Hi"; apcs(x); cout << x; // 輸出 Guide }
小測驗
一個函式可以傳入多個參數?