• C++关于Union使用的部分总结


    说明:未加说明,struct均指C++语言中的struct(可以有成员函数,可以定义访问属性)

    1 什么是Union?

    (1)与class,struct相似用于定义数据结构;union 可以说是一种特殊的类,有自己的成员变量也可以有自己的成员函数,默认访问属性为public;

    (2)共享同一内存;同一Union中的各个变量共享同一内存,也就是说,所有变量互斥存在。

    (3)基于(2),Union那么有人可能问,一个Union结构占用的内存大小如何确定?不多说上代码:

     1 // TemplateExe1.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 using namespace std;
     7 union uEx {
     8     int a;
     9     char b;
    10     double c;
    11 
    12 };
    13 int main()
    14 {
    15     cout << sizeof(uEx) << endl;
    16 
    17     return 0;
    18 }

    执行上述代码,不管你是否对uEx进行了初始化,sizeof(uEx)的大小始终为8(sizeof(double),32位IDE)。

    由此可得,联合(共用体变量)共用同一内存,内存大小固定为成员变量所占内存的最大值。

    2 为何使用Union?

    重要原因:节省内存。

    代码:

     1 // TemplateExe1.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 using namespace std;
     7 union uEx {
     8     int a;
     9     char b;
    10     double c;
    11 
    12 };
    13 class cEx
    14 {
    15     int a;
    16     char b;
    17     double c;
    18 };
    19 int main()
    20 {
    21     cout << sizeof(uEx) << endl;
    22     cout << sizeof(cEx) << endl;
    23     getchar();
    24     return 0;
    25 }

    以上代码运行结果是:

    8

    16。

    3 如何用?

    (1)同结构体一样,定义-初始化-使用;使用时注意共享内存即可。上代码:

     1 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 union Grade {
     5     int number;
     6     char mark;
     7     bool pass;
     8     
     9 }uGrade;
    10 int main()
    11 {
    12     uGrade.number = 90;
    13     printf("%d",uGrade.number);
    14     getchar();
    15     
    16     return 0;
    17 }

    代码中定义了一个全局Union 类,三个变量表示分数的三种形式。

    应用场景归纳如下:

    1)一门课程需要一个Grade数据结构来表示成绩;

    2)同时成绩有三种情况,并且一门课程的成绩只有一种表示(要么百分制,要么等级制,要么过与不过)。

    这时即可使用Union;

    除特殊说明外,其余所有文章均属原创。未经允许,请勿进行转载或者其他操作 有问题欢迎留言交流
  • 相关阅读:
    alpha测试和beta测试的区别
    当设计师遭遇HTML5
    软件开发项目中如何进行风险管理
    程序员应知——关注细节
    与Janet关于敏捷测试若干问题的Q&A
    软件开发中的哲学——世界的本原是物质(一)
    软件开发中的哲学——写在前面
    软硬兼施让客户满意
    浅谈DBA的角色以及与业务的关系
    连接access时的REGDB_E_CLASSNOTREG(0x80040154)错误
  • 原文地址:https://www.cnblogs.com/LiuBingBlogs/p/8545190.html
Copyright © 2020-2023  润新知