博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的union
阅读量:5273 次
发布时间:2019-06-14

本文共 1854 字,大约阅读时间需要 6 分钟。

1:,像任何类一样,union可以指定保护标记使成员成为公用的、私有的或受保护的。默认情况下,union 表现得像 struct:除非另外指定,否则 union 的成员都为 public 成员。

 

2:union 也可以定义成员函数,包括构造函数和析构函数。但是,union 不能作为基类使用,所以成员函数不能为虚数。

 

3:union 不能具有静态数据成员或引用成员,而且,union 不能具有定义了构造函数、析构函数或赋值操作符的类类型的成员:

union test{    int a;    float b;    std::string ss;};

         定义这样的union会产生编译错误:

test.cpp:9:14: error: member ‘std::__cxx11::string test::ss’ with constructor not allowed in union  std::string ss;              ^test.cpp:9:14: error: member ‘std::__cxx11::string test::ss’ with destructor not allowed in uniontest.cpp:9:14: error: member ‘std::__cxx11::string test::ss’ with copy assignment operator not allowed in uniontest.cpp:9:14: note: unrestricted unions only available with -std=c++11 or -std=gnu++11

 

4:union 最经常用作嵌套类型,然后定义一个单独的对象跟踪 union 中存储了什么值。这个附加对象称为 union 的判别式。判别式是外围类的一个成员:

class Token {public:    // indicates which kind of value is in val    enum TokenKind {INT, CHAR, DBL};    TokenKind tok;        union { // unnamed union        char cval;        int ival;        double dval;    } val; // member val is a union of the 3 listed types};Token token;switch (token.tok) {case Token::INT:    token.val.ival = 42; break;case Token::CHAR:    token.val.cval = 'a'; break;case Token::DBL:    token.val.dval = 3.14; break;}

 

5:不用于定义对象的未命名 union 称为匿名联合。匿名 union 的成员的名字出现在外围作用域中。例如,使用匿名 union 重写的 Token 类如下:

class Token {public:    // indicates which kind of token value is in val    enum TokenKind {INT, CHAR, DBL};    TokenKind tok;    union { // anonymous union        char cval;        int ival;        double dval;    };};Token token;switch (token.tok) {case Token::INT:    token.ival = 42; break;case Token::CHAR:    token.cval = 'a'; break;case Token::DBL:    token.dval = 3.14; break;}

因为匿名 union 不提供访问其成员的途径,所以将成员作为定义匿名union 的作用域的一部分直接访问。所以,匿名 union 不能有私有成员或受保护成员,也不能定义成员函数。

转载于:https://www.cnblogs.com/gqtcgq/p/7270380.html

你可能感兴趣的文章
Callable和Runnable和FutureTask
查看>>
GitHub 多人协作开发 三种方式:
查看>>
文本域添加编辑器
查看>>
Yum安装MySQL以及相关目录路径和修改目录
查看>>
java获取hostIp和hostName
查看>>
关于web服务器和数据库的各种说法(搜集到的)
查看>>
《TCP/IP 详解 卷一》读书笔记 -----第四章 ARP
查看>>
C# Stream 和 byte[] 之间的转换
查看>>
Cracking the code interview
查看>>
OMG: daily scrum nine
查看>>
redis与spring结合错误情况
查看>>
Vue.js的从入门到放弃进击录(二)
查看>>
第六章 字节码执行方式--解释执行和JIT
查看>>
Mesh属性[Unity]
查看>>
ajax与java后台交互
查看>>
面向对象之元类
查看>>
MySQL常用函数
查看>>
实现绘制图形的ToolBar
查看>>
C# 串口接收数据中serialPort.close()死锁
查看>>
Python3控制结构与函数
查看>>