# 结构体定义与使用

URL: https://caijiao.org/cpp/oop/struct
Source: docs/cpp/oop/struct.md
Description: 本节将介绍 C++ 中结构体的定义与使用，包括如何声明和定义结构体，以及如何在程序中实例化和操作结构体变量。

在 C++ 中，**结构体**（`struct`）是用户自定义的数据类型，它可以将不同类型的数据组合成一个整体。结构体使得相关的数据可以封装在一起，并作为一个单一的单位进行处理。

## 结构体定义

结构体的定义包括关键字 `struct`，然后是结构体名及其包含的数据成员。每个数据成员可以是不同的数据类型，结构体成员通过 `.` 运算符来访问。

### 示例：定义结构体

```cpp
#include <iostream>
using namespace std;

struct Person {
    string name;
    int age;
};

int main() {
    Person p1;  // 声明结构体变量 p1

    // 初始化成员
    p1.name = "Alice";
    p1.age = 25;

    // 输出结构体成员
    cout << "Name: " << p1.name << endl;
    cout << "Age: " << p1.age << endl;

    return 0;
}
````

### 输出：

```
Name: Alice
Age: 25
```

在此示例中，结构体 `Person` 定义了两个成员变量：`name` 和 `age`。在 `main` 函数中，我们通过结构体变量 `p1` 来访问和修改这些成员。

## 结构体初始化

结构体可以通过不同方式进行初始化：

### 1. 直接初始化

结构体成员可以在声明时直接初始化。

```cpp
Person p1 = {"Alice", 25};  // 直接初始化
```

### 2. 使用构造函数初始化

结构体也可以使用构造函数进行初始化（C++11 起支持）。

```cpp
struct Person {
    string name;
    int age;

    Person(string n, int a) : name(n), age(a) {}  // 构造函数
};

Person p1("Alice", 25);  // 使用构造函数初始化
```

## 访问结构体成员

访问结构体的成员需要使用 **点运算符**（`.`）。例如，要访问 `Person` 类型的变量 `p1` 的成员 `name`，可以使用 `p1.name`。

```cpp
cout << p1.name;  // 访问成员 name
```

## 结构体数组

可以创建结构体数组来存储多个结构体对象。例如：

```cpp
Person people[3];  // 创建一个 Person 类型的数组

people[0].name = "Alice";
people[0].age = 25;

people[1].name = "Bob";
people[1].age = 30;

people[2].name = "Charlie";
people[2].age = 35;
```

## 结构体指针

结构体也可以通过指针进行操作，指针使用 **箭头运算符**（`->`）来访问成员。

```cpp
Person p1 = {"Alice", 25};
Person* ptr = &p1;  // 指向 p1 的指针

cout << ptr->name << " is " << ptr->age << " years old." << endl;
```

### 输出：

```
Alice is 25 years old.
```

在这个例子中，`ptr` 是指向 `Person` 类型的指针，我们使用箭头运算符来访问 `p1` 的成员。

## 小结

* **结构体** 是 C++ 中用来组合不同类型数据的用户自定义数据类型。
* 结构体成员可以是不同类型，可以通过 **点运算符** 访问。
* 结构体可以通过直接初始化、构造函数或指针来使用。
* 使用结构体时，可以通过结构体变量、数组或指针来管理和操作数据。

结构体的使用在管理相关数据时非常方便，它帮助组织复杂的数据并提升代码的可读性和可维护性。
