union怎么在C++11中使用-创新互联

这期内容当中小编将会给大家带来有关union怎么在C++11中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

创新互联公司主要从事成都网站设计、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务沧州,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

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

  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(){};
};

上述就是小编为大家分享的union怎么在C++11中使用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联网站建设公司行业资讯频道。

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:union怎么在C++11中使用-创新互联
转载来于:http://scjbc.cn/article/pccjs.html

其他资讯