欢迎观临
路漫漫其修远兮,吾将上下而求索

C++ union介绍

union的定义和特性

C++union是继承自C的复合类型,和C语言中的union定义保持一致。union具有以下特点:

  1. union中所有成员共享同一段内存,所有成员起始地址相同;
  2. union的长度由最大长度的成员与类型长度最大的成员共同决定,其长度是类型长度最大的成员长度的整数倍;
  3. union的成员只能是内置类型和除引用外的复合类型;
  4. union不可以有静态成员。

union的长度

上面第二点描述了union的长度,理解起来可能有点绕,来看下面的例子:

union U {
    char ac[10];
    double d;
};

sizeof(U)的值必须不小于sizeof(char[10]),且是其类型长度最大成员d的长度的整数倍,在32位下,sizeof(double) == 8,所以,sizeof(U) == 16

union的成员类型

对于以上第三点,需要注意C++中的struct对于C语言struct的改变。C++中的struct可以用来定义C式结构体和类类型(class也一样)【C++内置类型和复合类型】。看下例代码:

class A {
public:
    int val;
    A(){}  //默认构造函数
};

union U {
    A a;  //A存在默认构造函数,是类类型,编译器报错
    char b;
};

int main()
{
    U u;
    u.a.val = 10;
    cout << u.a.val << endl;
    return 0;
}

上面的代码编译器会报错:

note: default constructor of 'U' is implicitly deleted because variant field 'a' has a non-trivial default constructor

如果将class A的默认构造函数去除,则没有问题。

union的使用

union常用于测试CPU大小端问题。如下代码:

bool isLittleEndian() {
    union testUnion{
        int a;
        char c;
    } test;
    test.a = 1;
    return test.c == 1;
}

总结

C++ union的使用应保持和C语言一致,应注意避免C++语言特性带来的隐性改变。

赞(0) 打赏
未经允许不得转载:云海鹰影博客 » C++ union介绍
分享到: 更多 (0)

欢迎留言 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1
    头像

    好文章,好好学习,天天向上,支持一下

    技能制造大师5个月前 (04-26)回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏