(六)C++中的结构体与联合体

引言


        在专栏C++教程的第五篇C++指针与引用中,深入了解C++中指针和引用是两种重要的数据类型,它们提供了对内存地址的间接访问能力,增强了程序设计的灵活性和效率。在专栏C++教程的第六篇中,我们将探讨C++中的结构体(struct)与联合体(union)的概念和使用场景。


结构体(struct)

  1. 定义与初始化: 结构体是C++中用于封装多个数据项的数据类型,这些数据项可以是不同类型的。声明一个结构体时,我们需要指定成员变量的名称以及它们的类型。

    struct Student {
    
        string name; // 姓名,类型为std::string
        int age;     // 年龄,类型为int
        double gpa;  // 成绩点,类型为double
    
    };


    初始化结构体的方式有两种:直接初始化每个成员或者通过结构体初始化列表:

    // 直接初始化
    Student s;
    s.name = "Alice";
    s.age = 20;
    s.gpa = 3.8;
    
    // 结构体初始化列表
    Student another_student{"Bob", 22, 3.9};

  2. 内存布局与对齐: C++编译器在处理结构体时会考虑到内存对齐,确保各成员按其自然对齐方式分配空间,以提高访问效率。这意味着结构体的实际大小可能大于各成员大小之和。


  3. 嵌套结构体与继承: 结构体内部可以包含其他结构体或类,形成嵌套结构。此外,在C++中,结构体也可以从其他结构体或类派生,实现类似面向对象编程中的继承特性。


  4. 结构体作为函数参数和返回值: 结构体可以直接作为函数的参数传递,也可以作为函数的返回值。这样可以让函数操作一组相关的数据,而不是单个独立的变量。


  5. 访问控制与封装: 虽然结构体成员默认为公有(public),但可以通过添加访问修饰符private或protected来实现封装,限制对成员的直接访问,鼓励通过成员函数进行间接访问。


联合体(union)

  1. 共享存储空间: 联合体的所有成员共享同一块内存区域,这意味着在同一时间,只能有一个成员有效。当给一个成员赋值后,先前存放在联合体内的其他成员的值将变得未定义。


  2. 大小与对齐: 联合体的大小等于其中最大成员所需的内存空间,并按照该最大成员的对齐要求进行内存对齐。
     


  3. 应用场景

    1. 节省内存在内存资源有限的情况下,例如嵌入式系统,可以利用联合体减少不必要的内存开销。


    2. 多态性解释在解析多义性数据时,如网络协议包,可以根据包的不同类型,将同一块内存分别解释为不同的数据结构。


  4. 安全使用 使用联合体时需要注意正确跟踪当前有效的成员。一种常见的做法是在联合体中添加一个额外的成员enumint来标识当前有效的成员类型。


总结

        结构体主要用于组织相关数据并保持各自状态,而联合体则在内存高效利用的前提下,提供了一种根据需求切换数据表示形式的方法。理解这两种复合数据类型的差异和适用场景,有助于编写出更高效、更具表达力的C++代码。

        请继续关注本专栏的更新内容,下一章节中我们将进一步深入C++的学习之旅,探索更高级的主题和特性。加油,每一位正在踏上C++学习之旅的朋友们!期待你们在C++的世界里收获满满的成就感与知识财富!
       感谢你的观看!有什么不足请在评论区发言告诉我,让我们一起进步吧!(鼓励让作者加油创作吧!)


Tip:为了获得更深入的学习体验,请参考相关教程或书籍,了解C++语言的更多基本结构和基本语法。

每篇图片分享

图片来自inscode上的开源程序

濒危动物:坎普龟

  • 58
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tyz_C

你的打赏是我最大动力,感谢大家

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值