首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 函數進階:參數傳遞、靜態變數、遞歸與指標返回完整實戰

     編輯:關於C++

函數基礎回顧

函數是獨立的程式碼區塊,具備名稱、返回類型、參數列表。良好的函數設計能實現程式碼復用、模組化、易於測試。函數原型宣告(如 int func(double, int);)讓編譯器提前知道介面,分離介面與實作。

三種參數傳遞機制深度解析

1. 傳值

複製實參值給形參,函數內修改不影響原值。適合小型資料(int、double 等)。

int passByValue(int a, int b) {
    a += 5; b += 5;  // 只修改副本
    return a + b;
}

2. 傳址

傳遞變數位址,函數可透過指標修改原值。需檢查空指標。

int passByPointer(int* a) {
    *a += 5;  // 修改原值
    return *a;
}

3. 傳參考

形參是實參別名,語法簡潔且效率高(無複製開銷)。大型物件首選 const T& 避免拷貝。

int passByRef(int& a, int& b) {
    a += 5; b += 5;
    return a + b;
}

函數返回指標:動態記憶體管理陷阱

鐵律:絕不返回區域變數位址。區域變數隨函數結束銷毀,返回的指標成懸空指標。

錯誤示範

int* badReturn(int a, int b) {
    int num = a + b;  // 區域變數
    return #      // 錯誤:返回區域變數位址
}

正確做法:動態配置

int* goodReturn(int a, int b) {
    int* p = new int(a + b + 10);  // 堆上配置
    return p;  // 呼叫端必須 delete
}

警示:動態記憶體易造成記憶體洩漏,現代 C++ 應優先使用智慧指標(unique_ptr、shared_ptr)或容器。

函數內靜態變數:跨呼叫保持狀態

static 區域變數只初始化一次,生命週期贯穿整個程式,但作用域仍限於函數內。適用於呼叫計數、快取等場景。

int callCounter(int a, int b) {
    static int count = 0;  // 僅首次呼叫初始化
    ++count;
    cout << "第 " << count << " 次呼叫" << endl;
    return a + b;
}

static 關鍵字多重含義總表

位置作用
函數內區域變數靜態儲存期,跨呼叫保值
全域變數/函數內部連結,僅本檔案可見
類別靜態成員全類別共享單一實例

遞歸函數:優雅與風險並存

函數直接/間接呼叫自身。必須有基底情況終止遞歸,否則無限遞歸導致堆疊溢位。

int factorial(int n) {
    if (n <= 1) return 1;  // 基底情況
    return n * factorial(n - 1);
}

遞歸 vs 迴圈

  • 遞歸:程式碼簡潔,適合樹狀結構、分治演算法;但有函數呼叫開銷、堆疊溢位風險。
  • 迴圈:效率高、無堆疊限制;但某些問題(如 Hanoi 塔)寫起來較繁瑣。
  • 原則:能用迴圈解決優先用迴圈,除非遞歸能顯著簡化邏輯且深度可控。

綜合實戰程式碼

#include <iostream>
using namespace std;

// 函數宣告
int passByValue(int, int);
int passByPointer(int*);
int passByRef(int&, int&);
int* returnPointer(int, int);
int staticCounter(int, int);
int factorial(int);

int main() {
    int a = 5, b = 5;
    int result;

    // 1. 傳值
    result = passByValue(a, b);
    cout << "傳值後 a=" << a << " b=" << b << " result=" << result << endl;

    // 2. 傳址
    result = passByPointer(&a);
    cout << "傳址後 a=" << a << " result=" << result << endl;

    // 3. 傳參考
    result = passByRef(a, b);
    cout << "傳參考後 a=" << a << " b=" << b << " result=" << result << endl;

    // 4. 返回指標
    int* p = returnPointer(a, b);
    cout << "返回指標值=" << *p << endl;
    delete p;  // 必須釋放

    // 5. 靜態計數器
    for (int i = 0; i < 4; ++i) staticCounter(a, b);

    // 6. 遞歸階乘
    cout << "5! = " << factorial(5) << endl;
    return 0;
}

// 實作略(見上文各段落)

核心心法

  1. 參數傳遞:只讀小物件傳值、大物件傳 const&、需修改傳 &、可選參數用指標。
  2. 返回指標:絕不返回區域變數位址,現代 C++ 改用智慧指標或 std::optional。
  3. static:善用靜態區域變數保持狀態,但注意執行緒安全。
  4. 遞歸:永遠定義清楚的終止條件,評估最大深度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved