C++11中的union

栏目: C++ · 发布时间: 6年前

内容简介:在C++11以后,很多基础语法都进行了修正。其中对于全部成员都是对于全部包含非

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

union
union
union

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

#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-inunion 类,则:

  1. 如果非静态(non-static)成员带有非平凡的特殊(non-trivial special)成员函数(自定义的:复制/移动构造函数,复制/移动赋值函数,析构函数),则该 union 类的默认相关的复制/移动构造函数、复制/移动赋值函数、析构函数都会被删除,如果需要的话,要求用户自己定义实现,如果用户没有自己定义,则不能进行相关的复制/移动操作
  2. 如果非静态(non-static)成员带有非平凡的特殊(non-trivial special)构造函数(自定义的构造函数),则该 union 类的默认构造函数会被删除,如果需要的话,要求用户自己定义实现,如果用户没有自己定义,则不能该 union 类不能进行实例化。
  3. 至多一个变体成员能拥有默认成员初始化值
  4. 不能有静态成员数据(这个很奇怪,在clang上会报链接错误而不是语法错误),但是可以有静态成员函数
  5. 全部成员的访问控制都是 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(){};
};

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机系统基础

计算机系统基础

袁春风 / 机械工业出版社 / 2014-7-1 / CNY 49.00

《计算机类专业系统能力培养系列教材:计算机系统基础》主要介绍与计算机系统相关的核心概念,解释这些概念如何相互关联并最终影响程序执行的结果和性能。共分8章,主要内容包括数据的表示和运算、程序的转换及机器级表示、程序的链接、程序的执行、存储器层次结构、虚拟存储器、异常控制流和I/O操作的实现等。内容详尽,反映现实,概念清楚,通俗易懂,实例丰富,并提供大量典型习题供读者练习。本书可以作为计算机专业本科或......一起来看看 《计算机系统基础》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具