时间:2021-05-20
前言
union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。例如
union Token{char cval;int ival;double dval;};c++11中union除了继承c语言的数据共享内存之外,行为上越来越像一个类,比如成员默认是public类型。
在C++11以后,很多基础语法都进行了修正。其中 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 类,则:
第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(){};};总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本节讨论下在C++11中怎样使用std::async来执行异步task。C++11中引入了std::async什么是std::asyncstd::async()
1,简介C++11中加入了头文件,此头文件主要声明了std::thread线程类。C++11的标准类std::thread对线程进行了封装,定义了C++11标准
在没有C++11的std::function和std::bind之前,我们使用函数指针的方式是五花八门,结构很繁琐难懂。C++11中提供了std::functi
c++11之后有了标准的线程库:std::thread。之前一些编译器使用C++11的编译参数是-std=c++11g++-std=c++11test.cpps
前言C++11之前valuecategories只有两类,lvalue和rvalue,在C++11之后出现了新的valuecategories,即prvalue