C++ 函數是程式的基本構建塊,良好的參數設計直接影響代碼的可讀性與安全性。在設計函數時,參數傳遞機制、默認值設置以及副作用處理都是必須掌握的核心知識點。
當實參表達式包含副作用運算符(如 ++x)時,不同編譯器可能產生不同結果。例如 int z = add_int(++x, x+y); 中,參數求值順序未被標準規定,導致行為未定義。最佳實踐:避免在函數調用中使用帶副作用的表達式作為實參。
C++ 允許在函數聲明或定義中為參數指定默認值,但必須遵循「右側參數若有默認值,左側不可缺少」的規則。編譯器按從左至右順序匹配實參,不足時自動補齊默認值。
// 正確:右側參數有默認值
void func(int a, int b = 10, int c = 20);
// 錯誤:左側參數無默認值
void func(int a = 5, int b); // 編譯錯誤
默認值不限於字面量,可以是任意複雜表達式,甚至包含函數調用。
數組傳遞本質上是指針傳遞,但語法形式不同,影響代碼可讀性與類型安全:
形參與實參共享同一塊內存,函數內修改數組元素會影響原數組。
void modify(int arr[], int n); // 等價於 int* arr
int a[5] = {1,2,3,4,5};
modify(a, 5); // a 的內容可能被修改
數組名本質是指向首元素的常量指針。形參可用 int* 或 int[],實參可用數組名或指針變量。
void process(int* ptr, int size);
int arr[10];
process(arr, 10); // 數組名隱式轉換為指針
process(&arr[0], 10); // 顯式取地址
利用類型別名定義數組類型,形參採用引用語法,保留數組大小信息,增強類型安全。
#include <iostream>
using namespace std;
typedef int Array8[8]; // 定義含 8 個 int 的數組類型
void fun(Array8 &b, int n) {
for (int i = 0; i < n; ++i)
b[7] += b[i]; // 直接操作原數組 a
}
int main() {
int a[8] = {1, 3, 5, 7, 9, 11, 13, 15};
fun(a, 8);
cout << a[7] << endl; // 輸出修改後的值
return 0;
}
此方式在 C++ 中較常用,既保留數組語義,又避免指針退化丟失大小信息。
std::vector 或 std::array 替代原始數組,獲得邊界檢查與值語義。