C++ 结构体(struct)(快速上手)

C++ 结构体(struct):让数据组织更高效

在学习 C++ 的过程中,你可能会遇到这样一个问题:如何把多个相关联的数据打包在一起,形成一个有意义的整体?比如描述一个人,需要名字、年龄、身高、体重等多个信息。如果用单独的变量来管理这些数据,代码会变得冗长且难以维护。

这时候,C++ 提供了一个非常实用的工具——结构体(struct)。它就像是一个“数据容器”,可以把不同类型的数据组合成一个逻辑单元。掌握了它,你就能写出更清晰、更易读的代码。

结构体是 C++ 中最基础的用户自定义数据类型之一,它允许我们将一组相关的变量封装在一起,形成一个整体。它不仅在程序设计中广泛应用,还是面向对象编程的基础构件之一。


什么是 C++ 结构体(struct)

结构体(struct)是一种用户自定义的数据类型,可以将不同类型的数据组合成一个整体。你可以把它想象成一个“数据盒子”——里面可以装不同的东西,比如一个学生的信息:姓名、学号、成绩。

结构体的语法非常直观。下面是一个简单的例子:

struct Student {
    string name;      // 学生姓名
    int id;           // 学号
    double score;     // 成绩
};

这段代码定义了一个名为 Student 的结构体,它包含三个成员:name(字符串类型)、id(整数类型)和 score(双精度浮点数类型)。一旦定义完成,就可以用它来创建具体的变量。

Student s1;  // 创建一个名为 s1 的 Student 类型变量
s1.name = "张三";
s1.id = 1001;
s1.score = 88.5;

通过这种方式,我们把一个人的多个信息“打包”在一起,操作起来自然流畅。

💡 提示:结构体的命名习惯和变量命名一样,建议使用驼峰命名法或大写首字母(如 Student),以提高可读性。


结构体的定义与使用方式

定义结构体的基本语法如下:

struct 结构体名 {
    数据类型 成员名1;
    数据类型 成员名2;
    // 可以有多个成员
};

注意:struct 是关键字,不能省略。虽然在 C++ 中可以省略 struct 关键字来声明变量(如 Student s;),但为了代码清晰,建议始终保留。

我们来看一个完整的示例:

#include <iostream>
#include <string>
using namespace std;

// 定义一个结构体:描述一个图书信息
struct Book {
    string title;      // 书名
    string author;     // 作者
    int year;          // 出版年份
    double price;      // 价格
};

int main() {
    // 创建一个 Book 类型的变量
    Book myBook;

    // 给成员赋值
    myBook.title = "C++ 编程入门";
    myBook.author = "李明";
    myBook.year = 2023;
    myBook.price = 68.0;

    // 输出信息
    cout << "书名:" << myBook.title << endl;
    cout << "作者:" << myBook.author << endl;
    cout << "出版年份:" << myBook.year << endl;
    cout << "价格:" << myBook.price << " 元" << endl;

    return 0;
}

输出结果:

书名:C++ 编程入门
作者:李明
出版年份:2023
价格:68 元

✅ 注释说明:

  • #include <string> 是为了使用 string 类型,否则编译会出错。
  • using namespace std; 是为了省略 std:: 前缀,便于书写。
  • myBook.title = "..." 是通过“点操作符”(.)访问结构体成员。
  • 所有成员变量都是公有的(public),这是结构体的默认访问权限。

结构体成员的访问与赋值

结构体的成员通过“点操作符”(.)进行访问和赋值。这个操作符就像一把钥匙,用来打开结构体这个“盒子”,取出或放入数据。

Book book1;

// 赋值
book1.title = "算法导论";
book1.author = "Thomas H. Cormen";
book1.year = 2009;
book1.price = 108.0;

// 读取并输出
cout << "书名:" << book1.title << endl;

点操作符是访问结构体成员的核心手段,它简单、直接、高效。

⚠️ 注意:如果结构体变量是通过指针访问的,需要使用 -> 操作符。例如:

Book* pBook = &book1;  // pBook 是指向 book1 的指针
pBook->title = "数据结构与算法";
cout << pBook->price << endl;

-> 操作符是 (*pBook).title 的简化写法,更简洁,也更常用。


结构体数组与初始化

结构体不仅可以单独使用,还能组成数组,用于管理多个同类对象。比如,我们要存储一个班级 5 个学生的数据,就可以用结构体数组。

struct Student {
    string name;
    int age;
    double gpa;
};

int main() {
    // 定义一个包含 5 个 Student 的数组
    Student classList[5];

    // 初始化第一个学生
    classList[0].name = "李华";
    classList[0].age = 18;
    classList[0].gpa = 3.8;

    // 初始化第二个学生
    classList[1].name = "王芳";
    classList[1].age = 17;
    classList[1].gpa = 3.9;

    // 遍历输出所有学生信息
    for (int i = 0; i < 2; i++) {
        cout << "学生姓名:" << classList[i].name << endl;
        cout << "年龄:" << classList[i].age << endl;
        cout << "GPA:" << classList[i].gpa << endl;
        cout << "--------" << endl;
    }

    return 0;
}

输出结果:

学生姓名:李华
年龄:18
GPA:3.8
--------
学生姓名:王芳
年龄:17
GPA:3.9
--------

这个例子展示了如何用结构体数组批量处理数据,特别适合管理学生、员工、商品等集合类信息。


结构体的初始化与构造函数(进阶)

C++ 支持对结构体进行初始化,尤其是在 C++ 11 及以后版本中,提供了“列表初始化”语法。

struct Point {
    double x;
    double y;
};

int main() {
    // 使用初始化列表(C++11+)
    Point p1 = {3.5, 4.2};
    Point p2{1.0, 2.0};

    cout << "p1: (" << p1.x << ", " << p1.y << ")" << endl;
    cout << "p2: (" << p2.x << ", " << p2.y << ")" << endl;

    return 0;
}

输出:

p1: (3.5, 4.2)
p2: (1, 2)

💡 提示:这种初始化方式简洁明了,特别适合在函数参数传递或返回值中使用。

虽然结构体本身不支持显式构造函数(除非你手动定义),但你可以通过函数封装来实现初始化逻辑。例如:

Point createPoint(double x, double y) {
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

这样就可以在函数中统一处理初始化逻辑,提升代码复用性。


实际应用案例:管理学生成绩系统

下面我们来看一个更完整的例子:一个简单的学生成绩管理系统。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct Student {
    string name;
    int id;
    double math;
    double english;
    double science;
    double total;
};

// 计算总分
void calculateTotal(Student& s) {
    s.total = s.math + s.english + s.science;
}

// 打印学生信息
void printStudent(const Student& s) {
    cout << "姓名:" << s.name << endl;
    cout << "学号:" << s.id << endl;
    cout << "数学:" << s.math << endl;
    cout << "英语:" << s.english << endl;
    cout << "科学:" << s.science << endl;
    cout << "总分:" << s.total << endl;
    cout << "==================" << endl;
}

int main() {
    // 创建一个学生列表
    vector<Student> students;

    // 添加学生数据
    Student s1;
    s1.name = "张三";
    s1.id = 1001;
    s1.math = 95.0;
    s1.english = 88.0;
    s1.science = 92.0;
    calculateTotal(s1);
    students.push_back(s1);

    Student s2;
    s2.name = "李四";
    s2.id = 1002;
    s2.math = 85.0;
    s2.english = 90.0;
    s2.science = 87.0;
    calculateTotal(s2);
    students.push_back(s2);

    // 输出所有学生信息
    for (const auto& s : students) {
        printStudent(s);
    }

    return 0;
}

这个系统展示了结构体在实际项目中的强大能力:它不仅能封装数据,还能配合函数、容器(如 vector)实现复杂逻辑。这种设计模式是很多 C++ 程序的基础。


总结与建议

C++ 结构体(struct)是一个功能强大且灵活的工具,它让数据组织变得井井有条。无论是管理一个人的信息,还是构建一个成绩系统,结构体都能让你的代码更清晰、更易维护。

通过本文的学习,你应该已经掌握了:

  • 如何定义结构体;
  • 如何创建结构体变量并访问成员;
  • 如何使用结构体数组处理批量数据;
  • 如何结合函数和容器实现实际功能。

建议你在今后的编程中,遇到多个相关数据时,先考虑是否可以用结构体来组织。这不仅能提升代码质量,还能为后续的面向对象编程打下坚实基础。

记住:好的数据结构,是好程序的起点。而 C++ 结构体,正是你迈向高级编程的第一步。