微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++11中union的使用方法示例

前言

union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。例如

union Token{

char cval;

int ival;

double dval;

};

c++11中union除了继承c语言的数据共享内存之外,行为上越来越像一个类,比如成员认是public类型。

在C++11以后,很多基础语法都进行了修正。其中 union 的行为向类对象进行了发展,在兼容原有语法定义的基础上进行了扩充:

union可以拥有成员函数(包含构造函数和析构函数),但是不能有虚函数

union不能参与继承,不能成为基类也不能成为子类

union的成员对象不能为引用类型

对于全部成员都是 build-in 的 union 类,还可以向以往一样进行使用:

#include

#include

union S

{

std::int32_t n; // 占用4字节

std::uint16_t s[2]; // 占用4字节

std::uint8_t c; // 占用1字节

}; // 整体占用4字节

int main()

{

S s = {0x12345678}; // 初始化第一个成员,当前s.n为活跃成员

// 于此点,读取 s.s 或 s.c 是未定义行为

std::cout << std::hex << "s.n = " << s.n << 'n';

s.s[0] = 0x0011; // s.s 现在是活跃成员

// 在此点,读取 s.n 或 s.c 是未定义行为

std::cout << "s.c is Now " << +s.c << 'n' // 11 or 00,依赖平台实现

<< "s.n is Now " << s.n << 'n'; // 12340011 or 00115678

}

对于全部包含非 built-in 的 union 类,则:

如果非静态(non-static)成员带有非平凡的特殊(non-trivial special)成员函数(自定义的:复制/移动构造函数,复制/移动赋值函数,析构函数),则该 union 类的认相关的复制/移动构造函数、复制/移动赋值函数、析构函数都会被删除,如果需要的话,要求用户自己定义实现,如果用户没有自己定义,则不能进行相关的复制/移动操作

如果非静态(non-static)成员带有非平凡的特殊(non-trivial special)构造函数(自定义的构造函数),则该 union 类的认构造函数会被删除,如果需要的话,要求用户自己定义实现,如果用户没有自己定义,则不能该 union 类不能进行实例化。

至多一个变体成员能拥有认成员初始化值

不能有静态成员数据(这个很奇怪,在clang上会报链接错误而不是语法错误),但是可以有静态成员函数

全部成员的访问控制都是 public

第1、2点的意思是,如果成员数据类型是非平凡的(non-trivial),则 union 类需要定义相关的构造函数、复制函数、移动构造、移动赋值函数、析构函数等。

union A {

int a;

double b;

std::string c;

A() : c("111") {} // 因为std::string拥有是非平凡的的数据类型,

~A() {} // 则A必须自定义构造函数和析构函数,否则无法进行实例化

// 如果想实现复制语义,还得自定义复制(构造)函数

};

第3点的意思是:

union A {

int a;

double b;

std::string c = "abc"; // 只有一个成员数据能拥有这种初始化值

~A(){};

};

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐