在 C++ 中,结构体(struct 是一种用户自定义的数据类型,用于将不同类型的数据(变量、函数等)组合成一个整体,以便更方便地管理和操作相关数据。结构体是 C++ 面向对象编程的基础之一,与类(class)类似,但默认访问权限不同。

一、结构体的基本定义与使用

1. 定义结构体

使用 struct 关键字定义结构体,语法如下:

struct 结构体名 {
// 成员变量(可以是不同类型)
类型1 变量名1;
类型2 变量名2;
// ...
// 成员函数(C++ 特有,C 语言结构体不能包含函数)
返回类型 函数名(参数列表) {
// 函数体
}
};

示例:定义一个表示“学生”的结构体

struct Student {
// 成员变量
int id; // 学号
string name; // 姓名
float score; // 成绩

// 成员函数:打印学生信息
void print() {
cout << "ID: " << id << ", 姓名: " << name << ", 成绩: " << score << endl;
}
};

2. 声明结构体变量

定义结构体后,可以像使用基本类型一样声明变量:

// 方式1:先定义结构体,再声明变量
Student s1; // s1 是 Student 类型的变量

// 方式2:定义结构体时同时声明变量
struct Teacher {
string name;
int age;
} t1, t2; // t1、t2 是 Teacher 类型的变量

3. 访问结构体成员

通过 . 运算符访问结构体变量的成员(变量或函数):

int main() {
Student s1;
// 赋值成员变量
s1.id = 1001;
s1.name = "张三";
s1.score = 95.5;
// 调用成员函数
s1.print(); // 输出:ID: 1001, 姓名: 张三, 成绩: 95.5
return 0;
}

如果是结构体指针,则通过 -> 运算符访问成员:

Student* p = &s1;
p->id = 1002; // 等价于 (*p).id = 1002
p->print(); // 等价于 (*p).print()

二、结构体的核心特性

1. 默认访问权限

  • 结构体的成员默认是 public(公有),外部可以直接访问(与类 class 相反,类默认是 private)。
  • 可以通过 publicprivateprotected 关键字修改成员的访问权限:
    struct Person {
    public:
    string name; // 公有成员,外部可访问
    private:
    int age; // 私有成员,仅内部可访问
    };

    int main() {
    Person p;
    p.name = "李四"; // 合法
    p.age = 20; // 错误:age 是私有成员,外部无法访问
    }

2. 构造函数与析构函数

C++ 结构体可以定义构造函数(初始化成员)和析构函数(清理资源),用法与类完全相同:

struct Book {
string title;
int pages;

// 构造函数(无返回值,与结构体同名)
Book(string t, int p) {
title = t;
pages = p;
}

// 析构函数(销毁对象时调用)
~Book() {
cout << "《" << title << "》被销毁" << endl;
}
};

int main() {
Book b("C++ Primer", 1000); // 调用构造函数初始化
cout << b.title << ", " << b.pages << "页" << endl;
return 0; // 程序结束时调用析构函数
}

3. 结构体数组与指针

  • 结构体数组:存储多个结构体对象的数组。

    Student class1[3] = {
    {1001, "张三", 90},
    {1002, "李四", 85},
    {1003, "王五", 92}
    };
    class1[0].print(); // 访问数组中第一个元素的成员函数
  • 结构体指针数组:数组元素是指向结构体的指针。

    Student s1 = {1001, "张三", 90};
    Student s2 = {1002, "李四", 85};
    Student* arr[2] = {&s1, &s2}; // 指针数组
    arr[0]->print(); // 通过指针访问成员

4. 结构体嵌套

结构体可以包含其他结构体作为成员,实现复杂数据结构:

struct Date {  // 日期结构体
int year;
int month;
int day;
};

struct Employee { // 员工结构体,嵌套 Date
string name;
Date hireDate; // 入职日期(Date 类型)
};

int main() {
Employee e;
e.name = "赵六";
e.hireDate.year = 2023;
e.hireDate.month = 10;
e.hireDate.day = 1;
return 0;
}

三、结构体与类的区别

C++ 中结构体(struct)和类(class)的核心功能几乎完全一致(都可以包含成员变量、函数、构造函数等),唯一的区别是:

  • 默认访问权限struct 成员默认是 publicclass 成员默认是 private
  • 继承默认权限struct 默认是公有继承,class 默认是私有继承(后续学习继承时会涉及)。

实际开发中,习惯上:

  • struct 表示“数据集合”(如坐标、日期等简单数据)。
  • class 表示“具有复杂行为的对象”(如学生、汽车等包含更多逻辑的实体)。