c++中使用联合体

定义:联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但是任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的

union U1
{
  int n;
  char s[11];
  double d;
};

联合体的大小

1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除

union U1
{
  int n;
  char s[11];
  double d;
};

int _tmain(int argc, _TCHAR* argv[])
{
  U1 u1;
  // 对于U1联合体,s占11字节,n占4字节,d占8字节,因此其至少需1字节的空间。然而其实际大小并不是11,用运算符sizeof测试其大小为16。这是因为这里存在字节对齐的问题,11既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了
  cout<<sizeof(u1)<<'\t'<<endl;
  cout<<"u1各数据地址:\n"<<&u1<<'\t'<<&u1.d<<'\t'<<&u1.s<<'\t'<<&u1.n<<endl;

  return 0;
}

匿名联合

class MCDValue
{
public:
  //  匿名联合作用域在外围对象,可直接使用外围对象访问联合成员变量
  //  匿名联合不能存在私有成员或保护成员,不能有成员函数
  union
  {
    std::string *pStr;
    int    num1;
    std::wstring *pWstr;
    double num2;  
  };
};

union判别式

class Token
{
public:
    //  给union对象的某个数据成员赋值其他数据成员会变为未定义的
    //  避免错误访问到其他成员,添加一个单独的对象跟踪
    enum TokenKind {INT1, CHAR1, DBL1};
    TokenKind tok;
    union TokenValue
    {
        char cval;
        int ival;
        double dval;
    }val;
};

联合体存储高低位

union Word
{
  __int16 v16;
  __int8  v8[2];
};

int _tmain(int argc, _TCHAR* argv[])
{
  Word word;
  word.v16 = 0x1122;

  printf("word.v16 = %x \n", word.v16);
  printf("word.v8[0] = %x \n", word.v8[0]);
  printf("word.v8[1] = %x \n", word.v8[1]);

  return 0;
}

union成员限制

1)union不能作为基类使用,所以成员函数不能为虚函数。
2)union不能具有静态数据成员或引用成员
3)union自身可以有析构和构造,但不能具有定义了析构或构造的类成员
4)匿名联合不能存在私有成员或保护成员,不能有成员函数

posted @   熊云港  阅读(2546)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示