# 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` 的變數中。