关于共用体

qq20004604
博客专家认证
2015-11-29 12:24:17
加精
共用体在C++ Primer Plus里,有点难理解,我总结了一下自己的理解,请大家指正
修改:把共用体记成共同体。。尴尬……已修改

(五十三)共用体
由于教程上的看的还是不太懂,以下是自己总结的
共用体(union)又称联合体,特点是
①一个共用体之下有多个变量,
②且同时只能存在一个,
③且后面进行赋值的会覆盖前面的,
④且只能使用int、char、double三种变量,
⑤且共用同一块内存(这也是后面会覆盖前面的原因),
⑥形式类似结构

标准格式为:
union 共用体名
{
int 变量名1;
char 变良名2;
double 变量名3;
};
共用体名 使用该共用体的共用体变量名;
共用体变量名.共用体内其中一个类型的变量名 = 值; //给共用体赋值


上代码:

#include<iostream>
using namespace std;

int main()
{
union abc //定义共用体abc
{
int a;
char b;
double c;
};
abc apple; //声明apple共用体
apple.b = 'a'; //初始化apple共用体char b的值为字符串a
cout << apple.b << endl;
apple.a = 10; //覆盖apple共用体的内存,用int a的值取代char b值
cout << apple.a << endl;
system("pause");
return 0;
}


注意:(根据实践总结,欢迎指正)
①根据实际测试,char类型不能用字符串(即像char b[10];这样在编译的时候会出问题);
②只能用int、char、double,其他类型不可以;
③定义和声明的形式,类似结构;
④共用体只能储存一个字符,如果储存多个字符,会出问题,例如之后的输入被跳过(因为存储空间溢出);
⑤共用体虽然可以变换为三种形式,但一次只能显示其中一种,如果想输入另外一种,那么前一种就会被覆盖(即再也调用不出来,就算调用,也调用的是错误的);
⑥共用体可以用在结构之中,如代码:
#include<iostream>
#include<string>
using namespace std;

struct abc //定义结构abc
{
string a; //结构的第一个成员为string a
union //结构的第二个成员为共用体,具体哪个需要看声明和初始化
{
int b; //共用体的第一个成员为int格式
double c; //共用体的第二个成员为double格式
};
};

int main()
{
abc gtt = { "数值" }; //声明gtt结构, 采用abc结构的形式,并初始化第一个成员的值为“数值”
gtt.b = 1; //初始化gtt结构的第二个成员,并且第二个成员采用共用体的第一个成员int类型
cout << gtt.a << endl; //输出结构的第一个成员
cout << gtt.b << endl; //输出结构的第二个成员(且格式为共用体第一个成员的类型)
gtt.c = 1.11; //覆盖gtt结构的第二个成员的值,并且采用的格式为共用体第二个成员的double类型
cout << gtt.c << endl; //输出结构第二个成员的值(且格式为共用体第二个成员的类型)
system("pause");
return 0;
}


输出结果为:
数值
1
1.11

我们可以从代码中看到,采用共用体时,共用体不同的成员(类型)需要使用不同的变量名,然后在初始化时,使用 结构名.共用体成员变量名 这种形式进行初始化,类似使用结构时的 结构名.结构成员变量名 这种形式。
(注:这次在union 后面直接是大括号,没有名字,使用的是匿名共用体的形式,和共用比相比,在引用的时候,可以不用写共用体的名,且匿名共用体的两个成员,认为是结构的两个成员——虽然同时只能存在一个)
...全文
1834 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2015-12-14
  • 打赏
  • 举报
回复
生成了 constructor ,就要配对的生成一个 destructor 。 但是在默认生成 destructor 时,编译器无法知道哪一个成员是有效的,因而无法析构。 所以所有维护 union 状态(就是哪一个成员有效)的事情,都必须交给程序员去处理。其中包括构造与析构,拷贝,等等。
引用 29 楼 fefe82 的回复:
它不知道应该初始化哪一个成员。 [quote=引用 28 楼 Jammg 的回复:] [quote=引用 3 楼 fefe82 的回复:] union 是 类的一种。它也有 constructor 。 但如果它的任何一个成员是一个类并且有 non-trivial constructor (比如 string),那么为 union 自动生成的 constructor 会被定义为 = delete 。这样,用户就必须自己为它写一个 constructor ,否则无法正常生成这个 union 的对象。 其它 special member function 同样。 如: destructor, copy/move constructor, copy/move assignment operator ....
你好,按照编译错误的提示看,的确是default constructor是delete了。 不过,如果将union也和class一样看待,那么编译器应该自动为union生成一个non-trival constructor吧,class就是这样的。 为啥union会是delete的呢....,求解释[/quote][/quote]
fefe82 2015-12-14
  • 打赏
  • 举报
回复
它不知道应该初始化哪一个成员。
引用 28 楼 Jammg 的回复:
[quote=引用 3 楼 fefe82 的回复:] union 是 类的一种。它也有 constructor 。 但如果它的任何一个成员是一个类并且有 non-trivial constructor (比如 string),那么为 union 自动生成的 constructor 会被定义为 = delete 。这样,用户就必须自己为它写一个 constructor ,否则无法正常生成这个 union 的对象。 其它 special member function 同样。 如: destructor, copy/move constructor, copy/move assignment operator ....
你好,按照编译错误的提示看,的确是default constructor是delete了。 不过,如果将union也和class一样看待,那么编译器应该自动为union生成一个non-trival constructor吧,class就是这样的。 为啥union会是delete的呢....,求解释[/quote]
weilin.jiang 2015-12-14
  • 打赏
  • 举报
回复
引用 3 楼 fefe82 的回复:
union 是 类的一种。它也有 constructor 。 但如果它的任何一个成员是一个类并且有 non-trivial constructor (比如 string),那么为 union 自动生成的 constructor 会被定义为 = delete 。这样,用户就必须自己为它写一个 constructor ,否则无法正常生成这个 union 的对象。 其它 special member function 同样。 如: destructor, copy/move constructor, copy/move assignment operator ....
你好,按照编译错误的提示看,的确是default constructor是delete了。 不过,如果将union也和class一样看待,那么编译器应该自动为union生成一个non-trival constructor吧,class就是这样的。 为啥union会是delete的呢....,求解释
「已注销」 2015-12-10
  • 打赏
  • 举报
回复
不说 C++ 的构造析构了,单以 C 的 union 而言,字符数组,结构体,都是可以作为 union 的成员。并没有你说的限制。
yyfhz 2015-12-07
  • 打赏
  • 举报
回复
union?呵呵应该是针对同一个内存区域的不同解读吧。 就好比在一张纸上画一个圆圈,数学家会说这是一个圆,天文学家会说这是行星公转的轨道,而一个小孩子可能会说这是一个太阳。
赵4老师 2015-12-01
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
钮牛 2015-12-01
  • 打赏
  • 举报
回复
来顶一层,有点无奈
xiaoxiangqing 2015-12-01
  • 打赏
  • 举报
回复
④且只能使用int、char、double三种变量,-->这个没试过,应该其它类型也可以吧
sichuanwww 2015-12-01
  • 打赏
  • 举报
回复
LY_Adieu 2015-12-01
  • 打赏
  • 举报
回复
union一般什么时候用,好像没用过
sunguanbin 2015-12-01
  • 打赏
  • 举报
回复
不错,了解一下。
schlafenhamster 2015-12-01
  • 打赏
  • 举报
回复
Compiler Error C2621 union 'union' : member 'identifier' has copy constructor The specified union member was declared with a copy constructor. A union member is not allowed to have a copy constructor. The following is an example of this error: class A { A( const A& ); // A has a copy constructor }; union U { A a; // error };
sportsman 2015-12-01
  • 打赏
  • 举报
回复
太深奥了,学习了
qq_29727489 2015-11-30
  • 打赏
  • 举报
回复
enenenne嗯 就是这样的
cdcjk 2015-11-30
  • 打赏
  • 举报
回复
union ab { ab(){a = 0;} ~ab(){} int a; string b; };
白衣如花 2015-11-30
  • 打赏
  • 举报
回复
以前不知道共用体有什么用,知道前两天看到了一个IP的共用体 IP可以是32位的int,也可以是4个unsigned char非常好用
Heafei 2015-11-30
  • 打赏
  • 举报
回复
我想看下我的CSDN ID
lm_whales 2015-11-29
  • 打赏
  • 举报
回复
毕竟如果两个不同类型的对象类型,占有相同内存的话 其内存布局,完全不同 假如都有handle 成员(动态分配的指针成员)的话,就很成问题 即便一个有handle 成员, 如果给不含handle 的成员赋值,就有可能造成 handle 对应的内存丢失,无法释放
lm_whales 2015-11-29
  • 打赏
  • 举报
回复
union 可以用, 任何 int(包括 char),任何浮点类型,(float,double,long double),以及指针 union,struct,以及 以上类型的 数组 作为他的成员 union ,struct ,数组 的任意成员,或者元素 也只能是上面的那些,不能包含对象类型 C++11 更灵活了,可以包含对象类型,不过使用起来就不如不包含对象类型的方便了
paschen 版主 2015-11-29
  • 打赏
  • 举报
回复
3楼正解
加载更多回复(8)

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧