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

C++ 语言特性12 - 联合体类型

一:概述

        C和C++中的联合体概念是类似的,联合体允许在同一个内存位置存储不同的数据类型,即多个对象共享同一片内存。但是,C++11对union进行了扩展,使其更加灵活和强大。以下是C语言和C++11中union的主要差异:

1. C语言中的union

  • 成员限制:C语言中的union只能包含POD(Plain Old Data)类型,即不能包含构造函数、析构函数或虚函数的类型。

  • 匿名联合体:C语言支持匿名联合体,这允许在结构体中定义没有名字的union

  • 大小union的大小等于最大成员的大小。

  • 对齐union的对齐方式通常与最大成员的对齐方式相同。

  • 构造和析构:C语言中的union成员不会自动调用构造函数或析构函数。

2. C++11中的union

  • 非受限联合体:C++11允许union包含非POD类型,包括具有构造函数和析构函数的类。

  • 委托构造函数:C++11允许在union中使用委托构造函数。

  • 静态成员:C++11允许union拥有静态成员函数。

  • 继承:C++11中的union可以继承其他类型,并且可以作为基类。

  • 成员函数union可以拥有成员函数,但不能有虚函数。

  • 默认构造函数:如果union包含非POD类型,其默认构造函数可能会被删除。

二:例子

    1. C语言中例子

#include <stdio.h>union Data {int i;float f;char str[20];
};int main() {union Data d;d.i = 42;printf("d.i = %d\n", d.i);// d.f = 3.14; // 也可以选择使用浮点数成员// strcpy(d.str, "Hello, World!"); // 或者使用字符数组成员return 0;
}

2. C++语言的例子

#include <iostream>
#include <string>union Data {int i;double d;std::string s;  // 非POD类型Data() : i(0), d(0.0) {}  // 默认构造函数
};int main() {Data d;d.i = 42;std::cout << "d.i = " << d.i << std::endl;// d.d = 3.14; // 也可以选择使用浮点数成员// d.s = "Hello, World!"; // 或者使用字符串成员return 0;
}

三:注意事项

  1. 类型安全:C++11中的union提供了更多的类型安全特性,但使用时仍需小心。

  2. 未定义行为:在union的非活跃成员上进行读取操作是未定义行为(union中被存储值的成员被称为活跃成员,而其他没有存储值的成员被称为非活跃成员)。

  3. 构造和析构:如果union包含有构造函数和析构函数的非POD类型,需要手动管理这些成员的构造和析构。

  4. C++11特性:使用C++11的union特性时,需要确保编译器支持这些特性。

 


http://www.mrgr.cn/news/41868.html

相关文章:

  • 【MySQL】SQL介绍+基础+DDL+数据备份+还原
  • SQL高级语法
  • 【python面试宝典3】遍历文件夹
  • PlantUML中的实体关系图
  • 前端登录页面验证码
  • 制造业的工业控制系统(ICS)安全策略
  • 数据资料安全治理新时代,AI/ML 来助力!
  • 树莓派5里使用protobuf
  • 提升美容院服务效率:SpringBoot管理系统开发指南
  • Linux 下 poll 详解
  • InfoGAN:通过信息最大化生成对抗网络进行可解释的表示学习
  • Python--CUDA安装异常处理
  • 07.useDefault
  • Java - LeetCode面试经典150题 - 哈希表 (二)
  • 基于SSM的本科生操行评定管理系统
  • 深度学习模型性能优化实战之从评估到提升的全流程解析
  • 软考中级网络工程师-基础配置
  • 美容院管理革命:基于SpringBoot的全方位解决方案
  • 汉代儒家对道家《老子》修改为儒家《道德经》
  • Python编码规范与常见问题纠正