C++结构体
在 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)。 - 可以通过
public、private、protected关键字修改成员的访问权限: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成员默认是public,class成员默认是private。 - 继承默认权限:
struct默认是公有继承,class默认是私有继承(后续学习继承时会涉及)。
实际开发中,习惯上:
- 用
struct表示“数据集合”(如坐标、日期等简单数据)。 - 用
class表示“具有复杂行为的对象”(如学生、汽车等包含更多逻辑的实体)。