---
# System prepended metadata

title: 'C++筆記: 函數(function)'
tags: [資料結構]

---

# 函數(function)
C++ 中的函數（function）是封裝一段特定邏輯或行為的代碼塊，通過函數可以重複使用代碼，提高代碼的可讀性和模組化。函數的定義和用法包含了定義、調用（或稱呼叫）、返回值、參數的傳遞等幾個部分。下面我將詳述如何定義和使用C++函數，並附上完整範例。
## 使用時機
1. 當要在不同地方執行邏輯相同
2. 遞迴(處理分治問題) : 主要是需要一直呼叫函式
3. 減少主程式碼的行數或分開許多複雜的演算，增加可讀性

### 零、方塊
- 方塊位置：自定義函式
- 方塊圖片
> void
![image](https://hackmd.io/_uploads/HJxZ90hD1e.png)
>
> 其他
> ![image](https://hackmd.io/_uploads/Sy37903P1x.png)



### 一、C++ 函數的基本組成

在C++中，函數的定義包含以下部分：

```cpp=
返回值類型 函數名稱(參數列表) {
    // 函數主體
    return 返回值; //除了void不用加，其他都需要加
}
```
:::danger
當返回函數值為`void`時，只能接`return;`，用來結束函式執行，不能接其他返回值的東西
:::
- **返回值類型**：函數執行後返回的數據類型，例如`int`、`double`、`void`（無返回值）等。
- **函數名稱**：對該函數的命名，通常使用動詞短語來描述其功能。
- **參數列表**：列出傳遞給函數的變量及其數據類型，可以為空（無參數）。
- **函數主體**：包含了函數的執行邏輯，位於大括號內。
- **return 返回值**：當函數有返回值時，使用 `return` 返回結果，若無返回值則可省略(但執行結束的路徑中一定要有返回值)。


### 二、函數的定義和範例

下面是一個計算兩個整數之和的函數範例。

#### 範例程式碼

**檔名：main.cpp**

```cpp=
#include <iostream>
using namespace std;

// 函數定義
int add(int a, int b) {  // 返回值類型為 int
    int sum = a + b;     // 計算和
    return sum;          // 返回計算結果
}

int main() {
    int num1, num2;
    cout << "輸入兩個整數：";
    cin >> num1 >> num2;

    // 呼叫函數
    int result = add(num1, num2);

    // 輸出結果
    cout << "兩數之和為：" << result << endl;

    return 0;
}
```

### 三、函數的使用步驟

1. **定義函數**：在主函數 `main()` 之外定義 `add` 函數，用來計算兩個整數的和。
2. **呼叫函數**：在 `main()` 函數內呼叫 `add()` 函數，將 `num1` 和 `num2` 作為參數傳遞給 `add` 函數。
3. **獲取返回值**：函數執行完成後，返回的計算結果被賦值給 `result` 變量。
4. **輸出結果**：將計算結果輸出到控制台。

### 四、C++函數的多種參數傳遞方式

C++支持以下參數傳遞方式：

1. **值傳遞（Pass by Value）**：函數內修改參數不會影響原變量。
2. **指標傳遞（Pass by Pointer）**：函數內修改指標指向的變量會影響原變量。
3. **引用傳遞（Pass by Reference）**：類似指標傳遞，但更安全且易於使用。

#### 值傳遞的範例

```cpp=
void incrementByValue(int x) {
    x++; // 修改不會影響原變量
}
```

#### 指標(pointer)傳遞的範例

```cpp=
void incrementByPointer(int *x) {
    (*x)++; // 修改會影響原變量
}
```

#### 參考/引用(reference)傳遞的範例

```cpp=
void incrementByReference(int &x) {
    x++; // 修改會影響原變量
}
```

### 五、常見的C++函數類型

1. **無返回值函數**：使用 `void` 作為返回值類型，只能接 `return;` 結束函數執行。
2. **帶返回值函數**：返回一個值，必須使用 `return` 返回結果。
3. **遞迴函數**：函數自己呼叫自己，適合處理具有遞迴結構的問題，例如費氏數列、階乘等。

#### 遞迴函數範例：計算階乘

```cpp=
int factorial(int n) {
    if (n <= 1) return 1;  // 基本情況
    else return n * factorial(n - 1);  // 遞迴呼叫
}
```

### 六、比較不同的參數傳遞方式

| 傳遞方式     | 說明                                 | 用法建議                               |
| ------------ | ------------------------------------ | -------------------------------------- |
| 值傳遞       | 傳遞的是變量的***拷貝***，函數內不影響外部變量 | 適合不需修改的變量                    |
| 指標傳遞     | 傳遞的是變量的***地址***，可以修改原變量   | 適合需要修改的變量，特別是大型數據結構 |
| 引用傳遞     | 傳遞的是變量的***引用***，方便且安全       | 推薦使用，簡潔且高效                   |

### 七、總結

- 函數的定義包含返回值類型、函數名稱、參數列表和函數主體。
- 函數的參數傳遞有三種主要方式：值傳遞、指標傳遞和引用傳遞。
- 使用函數可以提高代碼的模組化，使程序更具可讀性和可維護性。

[進階版function : lambda](https://hackmd.io/IPsrETJTSKeVXchIUrgSeg)