函數 是執行特定任務的語句群組。每個 C++ 程式至少有一個 main() 函數。良好的函數設計遵循「單一職責」原則,每個函數只做一件事。
回傳型別 函數名(參數列表) {
函數主體
return 回傳值; // void 型別可省略
}
四大組成要素:
void(無回傳)。int max(int num1, int num2) {
int result;
if (num1 > num2) result = num1;
else result = num2;
return result;
}
告知編譯器函數介面,實作可分離於不同檔案:
int max(int num1, int num2); // 參數名可省略:int max(int, int);
跨檔案呼叫時,於呼叫端檔案頂部包含宣告(通常置於標頭檔 .h/.hpp)。
#include <iostream>
using namespace std;
int max(int, int); // 宣告
int main() {
int a = 100, b = 200;
int ret = max(a, b); // 呼叫,控制權轉移
cout << "Max: " << ret << endl;
return 0;
}
int max(int num1, int num2) { // 定義
return (num1 > num2) ? num1 : num2;
}
呼叫時:實參複製/綁定給形參 → 執行主體 → return 或遇右大括號 → 控制權返回呼叫端。
| 模式 | 語法 | 特性 | 適用場景 |
|---|---|---|---|
| 傳值 | void f(int x) | 複製實參,函數內修改不影響外部 | 小型型別、唯讀輸入 |
| 指標傳遞 | void f(int *p) | 傳遞位址,可修改實參,可為 nullptr | 需修改實參、C 風格介面、可選參數 |
| 參考傳遞 | void f(int &r) | 實參別名,必須綁定合法物件,語法簡潔 | 需修改實參、大型物件唯讀(const T&) |
C++ 預設為傳值呼叫。大型物件唯讀請用 const T& 避免複製。
為尾部參數提供預設值,呼叫時可省略:
int sum(int a, int b = 20) { return a + b; }
sum(10, 5); // 15
sum(10); // 30,使用預設 b=20
規則:只有尾部參數可有預設值,且宣告與定義僅一處指定(通常在宣告)。
同名函數,參數列表不同(型別、數量、順序)。回傳型別不同不構成重載。
void print(int i) { cout << "int: " << i << endl; }
void print(double d) { cout << "double: " << d << endl; }
void print(const char* s) { cout << "string: " << s << endl; }
建議編譯器在呼叫點展開函數本體,減少呼叫開銷:
inline int square(int x) { return x * x; }
適用於簡短、高頻呼叫的函數;遞迴、複雜流程控制、虛函數通常不內聯。現代編譯器優化積極,inline 僅為建議。
函數直接/間接呼叫自身。需有基底情況終止遞迴。
unsigned long long factorial(unsigned n) {
return (n == 0) ? 1 : n * factorial(n - 1);
}
匿名函數物件,支援捕獲外部變數:
auto add = [](int a, int b) { return a + b; };
cout << add(3, 4); // 7
int factor = 10;
auto scale = [factor](int x) { return x * factor; }; // 值捕獲
std::function、Lambda、演算法替代傳統函數指標。