C++ union 联合

1、共用体是一种特殊的数据类型,允许在相同的位置存储不同的数据类型。

2、可以定义一个带有多成员的共用体,但是任何时候只有一个成员带有值。

3、共用体占用内存应足够存储共用体中最大成员。

例如:

union data { //声明了三个成员,但是长度不一(后面sizeof的结果不同机器结果不同,但double肯定是最长的),于是编译器会选取double的长的作为union data的长度

    int i;    // sizeof(int) = 4

    float f;  // sizeof(float) = 8

    double d; // sizeof(double) = 16

};

 

下面是c++代码栗子:

 

/*************************************************************************

    > File Name: union.cpp

    > Author: chenhui

    > Mail: xxxxxx

    > Created Time: 20151130日 10:45:52

 */

#include <stdio.h>

#include <string.h>

 

enum

{

    TYPE_INT=1,

    TYPE_FLOAT,

    TYPE_STR

};

 

struct TYPE_STRING//自定义字符串

{

    int len;

    char * content;

    void setVal(char * s)

    {

        content=s;

        len=strlen(s);

    }

};

 

union Data//

{

    int i;

    float f;

    struct TYPE_STRING str;//使用字符数组时注意越界

};

 

struct data_union

{

    int dataType;

    union Data uData;

 

    void setInt(int val)//c语言不支持在结构体中写函数,C++支持

    {

        //printf("set int\n");

        dataType=TYPE_INT;

        uData.i=val;

    }

    void setFloat(float val)

    {

        dataType=TYPE_FLOAT;

        uData.f=val;

    }

    void setString(char * val)

    {

        dataType=TYPE_STR;

        uData.str.setVal(val);

        //uData.str.content=val;

    }

};

 

void Print(struct data_union d)

{

    switch(d.dataType)

    {

        case TYPE_INT:

            printf("int:%d\n",d.uData.i);

            break;

        case TYPE_FLOAT:

            printf("float:%f\n",d.uData.f);

            break;

        case TYPE_STR:

            printf("strlen:%d\n",d.uData.str.len);

            printf("str:%s\n",d.uData.str.content);

            break;

        default:

            printf("unknown data type\n");

    }

}

int main(){

 

   struct data_union data;

 

   printf("Memory size occupied by data:%d\n",sizeof(data.uData));

    data.setInt(10);

 

   Print(data);

   char * s="asd";

   s="asdss";

   data.setString(s);

   Print(data);

 

   float f=12.33;

   data.setFloat(f);

   Print(data);

   return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值