ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【C++】共用体\联合体(union)

2019-11-16 15:53:56  阅读:615  来源: 互联网

标签:DateUnion union 成员 联合体 C++ int 共用 构造函数


          共用体的用法与结构体差不多,只不过将关键字由struct变成了union。共用体使不同的类型变量存放到同一段内存单元中,所以共用体在同一时刻只能存储一个数据成员的值,共用体的大小等于最大成员的大小(结构体变量的大小是所有数据成员大小的总和)。

         在程序中改变共用体的一个成员,其他成员也会随之改变。不是强制类型转换!而是因为他们的值的每一个二进制位都被新值所覆盖。

 1 #include <iostream>
 2 #include <string>
 3 #include <stdio.h>
 4 using namespace std;
 5 union DateUnion
 6 {
 7     int iInt1;
 8     int iInt2;
 9     double douDou;
10     char cChar;
11 };
12 int main()
13 {
14     DateUnion A;
15     A.iInt1 = 97;
16     cout << "A.iInt1=" << A.iInt1 << endl;
17     cout << "A.iInt2=" << A.iInt2 << endl;
18     cout << "A.douDou=" << A.douDou << endl;
19     cout << "A.cChar=" << A.cChar << endl << endl;
20 
21     A.iInt2 = 65;
22     cout << "A.iInt1=" << A.iInt1 << endl;
23     cout << "A.iInt2=" << A.iInt2 << endl;
24     cout << "A.douDou=" << A.douDou << endl;
25     cout << "A.cChar=" << A.cChar << endl << endl;
26 
27     A.cChar = 'a';
28     cout << "A.iInt1=" << A.iInt1 << endl;
29     cout << "A.iInt2=" << A.iInt2 << endl;
30     cout << "A.douDou=" << A.douDou << endl;
31     cout << "A.cChar=" << A.cChar << endl << endl;
32     system("pause");
33     return 0;
34 }

运算结果:


注意:

string可以作为结构体的成员但是不能作为共用体的成员。所以下面共用体的定义是错误的:

union DateUnion
{
    int iInt1;
    int iInt2;
    double douDou;string strChar;
};

严重性 代码 说明 项目 文件 行 禁止显示状态

错误 C2280 “DateUnion::DateUnion(void)”: 尝试引用已删除的函数 

此错误的原因:String 是一个类,有自己的构造函数,析构函数。

我们分析一下:

Union的一大特征在于,一个Union类中的所有数据共享同一段内存。如果union类的成员包含自己的构造函数,析构函数,那么同一Union类的成员在初始化时,就有可能会执行不同的构造函数。这是无法预料的。所以,我们在定义Union类时要尽量避免成员变量是对象(含有自己的构造函数)。

解决方案:String 换成基本的数据类型:char 等

union DateUnion
{
    int iInt1;
    int iInt2;
    double douDou;
    char cChar;
};

 

 

标签:DateUnion,union,成员,联合体,C++,int,共用,构造函数
来源: https://www.cnblogs.com/KMould/p/11872019.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有