内容简介:在C++11以后,很多基础语法都进行了修正。其中对于全部成员都是对于全部包含非
在C++11以后,很多基础语法都进行了修正。其中 union
的行为向类对象进行了发展,在兼容原有语法定义的基础上进行了扩充:
union union union
对于全部成员都是 build-in
的 union
类,还可以向以往一样进行使用:
#include <iostream>
#include <cstdint>
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(){};
};
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Automate This
Christopher Steiner / Portfolio / 2013-8-9 / USD 25.95
"The rousing story of the last gasp of human agency and how today's best and brightest minds are endeavoring to put an end to it." It used to be that to diagnose an illness, interpret legal docume......一起来看看 《Automate This》 这本书的介绍吧!