函數定義與聲明
| 方式 | 語法 | 特點 |
| 值傳遞 | void f(int x) | 拷貝實參,修改不影響原值 |
| 引用傳遞 | void f(int &x) | 別名,可修改實參,避免拷貝大對象 |
| const 引用 | void f(const int &x) | 只讀訪問,接受字面值/臨時對象 |
| 指針傳遞 | void f(int *p) | 可為空,需解引用,傳統 C 風格 |
返回值
- 返回引用時,**不得返回局部變量引用**(懸空引用)。
- 返回值優化(RVO/NRVO)可消除拷貝。
main 返回 int,無 return 默認返回 0。
函數重載
- 同名函數,參數列表不同(類型、個數、順序)。
- 返回類型**不能**作為重載依據。
const 參數可區分重載:f(int&) vs f(const int&)。
默認參數
inline int max(int a, int b) { return a>b?a:b; }
- 建議編譯器展開調用點,避免函數調用開銷。
- 定義需在調用前可見(通常放頭文件)。
- 遞歸、複雜控制流函數通常不內聯。
constexpr 函數 (C++11)
int (*pf)(int); // 函數指針
function ff; // 類型擦除,可存 lambda/bind/函數指針
遞歸
- 基準情況 + 遞歸步驟。
- 尾遞歸優化(編譯器支持時)可轉為迭代,避免棧溢出。
最佳實踐
- 參數傳遞:大對象用
const T&,需修改用 T&,小對象(int, 指針)用值傳遞。
- 單一職責:函數功能單一,名稱清晰表達意圖。
- 斷言前置條件:
assert(ptr != nullptr)。
- 異常安全:資源用 RAII,函數要么完成要么回滾(強異常安全)。