以前写代码,很少使用union,所以在潜意识中,经常将其忽略。最近要写个生成一段数据的程序,数据类型有两种,一种保护的数据多些,另一种只包含第一种中的部分数据。因为潜意识中没有union,所以开始也没想到用union来实现。给同事讨论时,同事提示用union时,自己才想起来,C++中还有union。
依次为契机,就在网上查了些介绍union的资料,给自己补补课。下面总结了一下使用union的几个注意点,深层次的东西就不去探讨了。
1、共享内存
也就是共享起始地址。union变量中,可以包含union中的任何一个成员,但是该union变量的起始地址是固定的。
2、取最大成员的空间
既然union变量可以包含union中的任何一个成员,所以分配的空间必须确保能放得下最大的变量,这一点也比较容易理解。
3、成员类不可以有构造函数
此处就不对struct和class作区别了。为什么不能包含呢,此处借鉴了:http://tech.china.com/zh_cn/netschool/programme/c/656/20050811/12562605.html
中的思想。不过,本人还是想在此处再说一遍,也为了加深我的记忆。
为什么不允许成员类有构造函数呢,因为union也有难处,呵呵。如果成员有构造函数的话,在定义union(假设其中有类和基本类型的成员)变量的时候就不知道该不该去调用类的构造函数?如果调用了,而只使用了union中的基本类型的成员,显然构造函数的调用是多余的;如果没调,则类中的信息并没有初始化,如果使用,就会造成问题。还有,假如构造函数中分配了资源,在union变量被销毁的时候,也会去调用析构函数,释放资源?再假如,union中的多个类成员的构造函数中都分配了资源,union变量被销毁的时候,会分别调用每个成员析构函数,去释放资源么?
这样只会让union趋于无限复杂。
还有,包含构造函数/析构函数/拷贝构造函数/赋值运算符/虚函数的类成员,在union中都是不被允许的。
4、union可以有构造函数
个人觉得这可以算得上语言包容性的一个体现。union和struct、class一样,也是一种类型,既然是一种类型,就可以有构造函数,来构造该类型的对象。虽然这么做是允许的,但该做法并不被推荐。
分享到:
相关推荐
主要介绍了C语言、C++中的union用法总结,本文讲解了什么是union、C中使用union、当union遇到对象等内容,需要的朋友可以参考下
(使用C++,不建议用伪码) #include using namespace std; void main() { char a[50];memset(a,0,sizeof(a)); int i=0,j; char t; cin.getline(a,50,'\n'); for(i=0,j=strlen(a)-1;i(a)/2;i++,j--) { t=...
南科大于仕琪副教授的C++课程的学习与总结: 1、C++的基础知识(第一章到第四章) 第一章、编译与预处理,C++环境的介绍 答:主要讲授了C++以及C语言的常用的基础语法,比如,编译链接,预处理宏,输入输出函数, ...
本文给大家介绍的是关于C++结构体内存对齐计算的相关内容,内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。...
在此总结⼀下,如有错误,欢迎指出。 声明与定义 ⾸先从声明和定义说起。 声明是数据对象的和函数的描述。声明的作⽤就是让编译器知道实体的名字,以及其数据类型或函数签名。如: external int x; //变量声明 void ...
Union:将两个子集合并成同一个集合。 并查集主要运用在合并元素以及查询两个元素是否在同一集合的问题,在信息学竞赛中广泛涉及 初始化: 一开始,每一个元素都是一个集合,打个比方,每个人所在的 ” 家族 ” ...
leetcode动态规划总结...Union-Find - 先进先出 - 先进后出 - 二分查找 - 堆排序 - Hash Map&Set - 动态规划 - 特例 - 设计问题- 笔记 给阅读此 repo 的人的希望信息: 满招损,减贫 因骄傲而输,因谦虚而获得。
将VISUAL C++与SQL 结合使用292 将DELPHI 与SQL 结合使用296 总结302 问与答303 校练场303 练习303 第二周回顾304 第三周概貌305 应用你对SQL 的知识305 第15 天对SQL 语句优化以提高其性能306 目标306 让你的SQL ...
1. What will be the output of the following C code? #include int main(int argc, char* argv[]) { int b=3; int arr[] = {6, 7, 8, 9, 10}; int *ptr = arr;... *(ptr++) += 123;... printf("%d, %d\n", *...union{
8.3.7 SELECT语句各查询子句总结 第9章 多表查询 9.1 本章用到的实例表 9.2 表的基本连接 9.2.1 连接表的目的 9.2.2 简单的二表连接 9.2.3 多表连接 9.2.4 使用表别名 9.2.5 采用JOIN关键字建立...
8.3.7 select语句各查询子句总结 156 第9章 多表查询 157 9.1 本章用到的实例表 157 9.2 表的基本连接 158 9.2.1 连接表的目的 158 9.2.2 简单的二表连接 159 9.2.3 多表连接 161 9.2.4 使用表别名 162 ...
4.2.1 UNION和UNION ALL 103 4.2.2 MINUS 106 4.2.3 INTERSECT 107 4.3 集合与空值 108 4.3.1 空值与非直观结果 108 4.3.2 集合运算中的空值行为 110 4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合...
并可以与导入的三维网格进行合并生成新的三维网格模型的操作,总结起来有以下功能: 简单多边形切割 三维网格位移、缩放、旋转 三维网格的合并 保存已操作的三维网格 按键说明 按键 说明 Back 撤销 clearAllPoints ...
21天学习SQL V1.0.pdf ...总结........................................................................................................................ 92 问与答......................................