C++ 结构体(struct)与联合体(union)
一、结构体(struct)
1. 基本概念
结构体是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起形成一个新的复合数据类型。
struct Person {std::string name;int age;float height;
};
2. 结构体的声明与定义
声明方式:
struct 结构体名 {数据类型 成员1;数据类型 成员2;// ...
};
定义结构体变量:
Person p1; // 创建一个Person类型的变量
Person p2 = {"Alice", 25, 1.68f}; // 初始化列表方式
3. 结构体的特点
可以包含不同类型的成员
成员默认是public访问权限(与class不同)
可以包含成员函数(C++中)
可以使用typedef简化类型名
4. 结构体的使用
访问成员:
p1.name = "Bob";
p1.age = 30;
std::cout << p1.height;
结构体作为函数参数:
void printPerson(const Person& p) {std::cout << "Name: " << p.name << ", Age: " << p.age;
}
结构体嵌套:
struct Address {std::string city;std::string street;
};struct Employee {Person info;Address addr;int employeeId;
};
5. 结构体与类(class)的区别
特性 | 结构体(struct) | 类(class) |
---|---|---|
默认访问权限 | public | private |
继承默认权限 | public | private |
通常用途 | 数据聚合 | 对象封装 |
二、联合体(union)
1. 基本概念
联合体是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,但同一时间只能存储其中一个成员的值。
union Data {int i;float f;char str[20];
};
2. 联合体的声明与定义
声明方式:
union 联合体名 {数据类型 成员1;数据类型 成员2;// ...
};
定义联合体变量:
Data d1;
d1.i = 10; // 当前存储的是int
d1.f = 3.14f; // 现在存储的是float,之前的值被覆盖
3. 联合体的特点
所有成员共享同一块内存空间
大小由最大成员决定
同一时间只能有效存储一个成员的值
默认public访问权限
常用于节省内存或实现变体类型
4. 联合体的使用
访问成员:
Data d;
d.i = 10;
std::cout << d.i; // 正确
std::cout << d.f; // 未定义行为,因为当前存储的是int
匿名联合体:
struct Variant {enum { INT, FLOAT, STRING } type;union {int i;float f;char str[20];}; // 匿名联合体
};Variant v;
v.type = Variant::INT;
v.i = 42; // 直接访问匿名联合体成员
5. 联合体的应用场景
节省内存:当多个数据不会同时使用时
类型转换:通过联合体查看同一数据的多种表示形式
硬件寄存器映射:与硬件交互时
实现变体类型:结合枚举类型使用
三、结构体与联合体的比较
特性 | 结构体(struct) | 联合体(union) |
---|---|---|
内存分配 | 每个成员有独立内存空间 | 所有成员共享同一内存空间 |
大小 | 所有成员大小之和(考虑对齐) | 最大成员的大小 |
同时访问多个成员 | 可以 | 不可以 |
默认访问权限 | public | public |
典型用途 | 数据聚合 | 节省内存、变体类型 |