当前位置: 首页 > news >正文

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)
默认访问权限publicprivate
继承默认权限publicprivate
通常用途数据聚合对象封装

二、联合体(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. 联合体的应用场景

  1. 节省内存:当多个数据不会同时使用时

  2. 类型转换:通过联合体查看同一数据的多种表示形式

  3. 硬件寄存器映射:与硬件交互时

  4. 实现变体类型:结合枚举类型使用

三、结构体与联合体的比较

特性结构体(struct)联合体(union)
内存分配每个成员有独立内存空间所有成员共享同一内存空间
大小所有成员大小之和(考虑对齐)最大成员的大小
同时访问多个成员可以不可以
默认访问权限publicpublic
典型用途数据聚合节省内存、变体类型

http://www.lryc.cn/news/596125.html

相关文章:

  • 逻辑回归全景解析:从数学本质到工业级优化
  • AWS PrivateLink方式访问Redis
  • NIO技术原理以及应用(AI)
  • AWS RDS 排查性能问题
  • 图像基础:从像素到 OpenCV 的入门指南
  • 基于python django深度学习的中文文本检测+识别,可以前端上传图片和后台管理图片
  • 【学习路线】Python全栈开发攻略:从编程入门到AI应用实战
  • Spring 核心知识点梳理 1
  • 2.9学习DOM和BOM (主要是获取元素的操作)
  • 【element-ui el-table】多选表格勾选时默认勾选了全部,row-key绑定异常问题解决
  • 重塑优化建模与算法设计:2025年大模型(LLM)在优化领域的应用盘点 - 1
  • MybatisPlus-16.扩展功能-枚举处理器
  • SpringMVC快速入门之核心配置详解
  • 【windows修复】解决windows10,没有【相机] 功能问题
  • Azure可靠性架构指南:构建云时代的高可用系统
  • xss-labs解答
  • 本地数据库有数据,web页面无信息显示,可能是pymysql的版本问题【pymysql连接本地数据库新旧版本的区别】
  • 【51单片机定时器T0输出10毫秒周期方波12M晶振】2022-6-28
  • Web开发 05
  • verilator如何实现RTL的仿真(腾讯混元)
  • 牛客NC16625 [NOIP2009]分数线划定(排序)
  • vue3:十八、内容管理-实现内容的数据展示,开关switch设行,tag标签展示
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十七天
  • Datawhale AI 夏令营-心理健康Agent开发学习-Task1
  • React 面试题库
  • Vue 3 面试题全套题库
  • 前端面试专栏-工程化:29.微前端架构设计与实践
  • class和struct的区别
  • RAG实战指南 Day 21:检索前处理与查询重写技术
  • 腾讯研究院 | AI 浪潮中的中国品牌优势解码:华为、小米、大疆、科大讯飞等品牌从技术破壁到生态领跑的全维突围