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 union
test.cpp:9:14: error: member ‘std::__cxx11::string test::ss’ with copy assignment operator not allowed in union
test.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 不能有私有成员或受保护成员,也不能定义成员函数。

最新文章

  1. NavigationController
  2. 【Oracle】oracle取最大值和最小值的几个方法汇总
  3. 转:PostgreSQL Cheat Sheet
  4. #include <cstdio>
  5. 使用JSExcelXML.js导出Excel模板
  6. django with mysql (part-1)
  7. java中.equals和==的区别?
  8. poj3553 拓扑序+排序贪心
  9. lof基金
  10. 计算机IT求职学习List
  11. java.sql.DataTruncation: Data truncation
  12. 【项目经验】如何用TexturePacker & Physicseditor开发游戏
  13. (一)原生JS实现 - 基本类方法
  14. 执行yiic webapp命令时报错:php.exe不是内部或外部命令,也不是可运行的程序
  15. Hibernate 配置详解(12) 其实我也不想用这么土的名字
  16. mkconfig文件解析
  17. webpack引入handlebars报错'You must pass a string or Handlebars AST to Handlebars.compile'
  18. SignalR的另类实现技巧
  19. 1-51单片机WIFI学习(开发板介绍)
  20. PDF 补丁丁 0.6.0.3340 版发布(修复提取图片的问题)

热门文章

  1. HTML入门:Tag学习
  2. 2019-4-6-VisualStudio-编码规范工具-2.6-修改当前文件编码
  3. Effective Modern C++  条款1:理解模板型别推导
  4. 主流浏览器HTML5视频格式差异
  5. Css 进阶学习
  6. es6模块化规则(一)
  7. g++编译多个源原文件和头文件(转载)
  8. Objective-C头文件导出工具class-dump
  9. android 数据库存取图片
  10. dll加载过程全局变量会先初始化