---
# System prepended metadata

title: C++_struct（結構體）

---

# Struct

## **1. 什麼是 `struct`？**
在 `C++` 中，`struct`（結構體）是一種自訂資料型別，可以用來封裝多個**變數**，通常用於表示一個物件的屬性。

## **2. `struct` 的基本語法**
```cpp=
struct 結構名稱 {
    資料類型 變數名稱;
    // 可以有多個成員變數
};
```
- `struct` 是關鍵字(就像`cout`、`cin`)，用來定義結構體。
- `結構名稱` 是結構體的名稱。(看心情取，只要不違反變數宣告規則的都可以)
- `{}` 內部包含多個成員變數。
- `;` 代表結構定義的結束。(一定要記得加)

用實例代替大概就是以下這樣

**基本範例**
```cpp=
#include <iostream>
using namespace std;

struct Person {
    string name; //字串變數
    int age; //整數變數
};

int main() {
    Person p1 = {"Alice", 25}; //賦值
    cout << "Name: " << p1.name << ", Age: " << p1.age << endl;
    return 0;
}
```
**輸出：**
```
Name: Alice, Age: 25
```

## **3. 初始化 `struct`**
### **方法 1：大括號初始化**
```cpp=
Person p1 = {"Bob", 30};
```
### **方法 2：指定成員初始化（C++11 以上）**
```cpp=
Person p2 { .name = "Charlie", .age = 22 };
```

## **4. `struct` 陣列**
可以使用 `struct` 陣列來存放多個相同類型的結構體。

### 怎麼宣告??
```cpp
struct 結構名稱 {
    資料類型 變數名稱;
    // code...
} 變數名稱[陣列大小]; //塞在struct屁股後面
```
- 可以在 `struct` 宣告的尾端直接定義陣列變數。

### **範例**
```cpp
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
} people[3] = {  // 直接宣告陣列並初始化
    {"Alice", 25},
    {"Bob", 30},
    {"Charlie", 22}
};

int main() {
    for (const Person &p : people) { //遍歷
        cout << "Name: " << p.name << ", Age: " << p.age << endl;
    }
    return 0;
}
```
**輸出：**
```
Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 22
```

但是，妳也可以這樣寫

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

struct Person {
    string name;
    int age;
};

int main() {
    Person people[3] = {
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 22}
    };
    
    for (const Person &p : people) {
        cout << "Name: " << p.name << ", Age: " << p.age << endl;
    }
    return 0;
}
```
**輸出：**
```
Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 22
```

## **5. `struct` 內的函式**
```cpp=
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
    
    void introduce() {
        cout << "Hi, I'm " << name << " and I'm " << age << " years old." << endl;
    }
};

int main() {
    Person p = {"David", 28};
    p.introduce();
    return 0;
}
```

就跟普通函式差不多，但還是有差。
至於細部解說會另開一篇講義。

**輸出：**
```
Hi, I'm David and I'm 28 years old.
```

## **6. `struct` 指標與動態記憶體**
```cpp=
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    Person *p = new Person{"Eve", 24}; //new技術會在pointers講義做解說
    cout << "Name: " << p->name << ", Age: " << p->age << endl;
    delete p;
    return 0;
}
```
**輸出：**
```
Name: Eve, Age: 24
```

## **7. `struct` 與 `class` 的區別**

可能有些電神已經知道 `class` 這東東了，他也是一種**結構體**，之後會在開講義解說喔!!

| `struct` | `class` |
|----------|--------|
| 成員預設為 `public` | 成員預設為 `private` |
| 適用於簡單資料結構 | 適用於封裝更完整的物件 |

# 😊
如果要記，那可以把 `struct` 記成一種自訂義的 `type` (資料型態)。

## 怎麼輸入呢??

### 1.直接輸入數值到 struct
你可以在 `main()` 裡直接為 `struct` 變數的成員賦值：

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

struct Point {
    int x, y;
};

int main() {
    Point p1;

    cout << "輸入 x: ";
    cin >> p1.x;  // 直接輸入數值到 p1.x
    cout << "輸入 y: ";
    cin >> p1.y;  // 直接輸入數值到 p1.y

    cout << "Point(" << p1.x << ", " << p1.y << ")" << endl;
}

```
📌 這樣 `cin` 會從鍵盤讀取數值並存入 `p1.x` 和 `p1.y`。

### 2.使用 main() 裡的變數來賦值
你也可以使用 `main()` 裡的變數來賦值給 `struct` 成員：

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

struct Point {
    int x, y;
};

int main() {
    int a, b; // main() 裡的變數
    cout << "輸入 a: ";
    cin >> a;
    cout << "輸入 b: ";
    cin >> b;

    Point p1;  
    p1.x = a;  // 使用 main 裡的變數 a
    p1.y = b;  // 使用 main 裡的變數 b

    cout << "Point(" << p1.x << ", " << p1.y << ")" << endl;
}
```
    
這樣 `a` 和 `b` 先接收輸入的值，然後再存入 `struct` 的變數中。
