39、C++ Primer 4th笔记,特殊工具与技术,联合(union)

简介: 1、联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但是任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的。每个 union 对象的大小在编译时是固定的:至少与最大数据成员的一样大。

1、联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但是任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的。每个 union 对象的大小在编译时是固定的:至少与最大数据成员的一样大。

2union不能作为基类使用,所以成员函数不能为虚函数。union不能具有静态数据成员或引用成员,而且,union不能具有定义了构造函数,析构函数或赋值操作符的类类型的成员。

3、默认情况下,union对象是未初始化的。可以用与显式初始化、简单类对象一样的方法显式初始化union对象。但是,只能为第一个成员提供初始化式,通过一对花括号。通过访问操作符(.->)访问union类型对象的成员。

4、给union对象的某个数据成员一个值使得其他数据成员变为未定义的。使用union对象时,我们必须知道union对象中当前存储的是什么类型的值。通过错误的数据成员检索保存在union对象中的值,可能会导致程序崩溃或其他不确定的程序行为。通常,我们避免错误访问union成员的一个方法是:定义一个单独的对象跟踪union中存储了什么值,称这个附加对象为union的判别式(discriminant)。

示例代码

#include <iostream>
#include "string"
using namespace std;

class Token
{
public:
	enum TokenKind {INT1, CHAR1, DBL1};
	TokenKind tok;
	union TokenValue
	{
		char cval;
		int ival;
		double dval;
	}val;
};

union TokenValue2
{
	char cval;
	int ival;
	double dval;
};
int main()
{	
	Token first_token;
	switch(first_token.tok)
	{
	case Token::INT1:
		first_token.val.ival = 42;
		break;
	case Token::CHAR1:
		first_token.val.cval = '1';
		break;
	case Token::DBL1:
		first_token.val.dval = 3.14;
		break;
	default:
		break;
	}
	//初始化union
	TokenValue2 second_token = {'a'};
	return 1;
}

5、匿名(anonyous union)联合

    未命名的联合。因为匿名union不提供访问其成员的途径,所以将成员作为定义匿名union的作用域的一部分直接访问。

first_token.cval = '1';

    匿名union不能有私有成员或受保护成员,也不能定义成员函数。

6、局部类

    可以在函数体内部定义类,这样的类称为局部类(local class)。由于这样的类使用的情况很少,使用时可以参见Primer18章。

目录
相关文章
|
1月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
42 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
28天前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
2月前
|
人工智能 Anolis
聚焦C++20 最新标准!技术 Workshop 精彩亮点一览 | 2024 龙蜥大会
多场技术 Workshop、多位领域专家亲自授课,分享独家洞察与宝贵经验。
|
2月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
20 1
|
2月前
|
算法 C# 开发工具
《黑神话:悟空》背后的编程语言揭秘——超越C++的多元技术融合
【8月更文挑战第27天】在游戏开发领域,一款游戏的成功往往离不开其背后强大的技术支持和编程语言的精妙运用。《黑神话:悟空》作为备受瞩目的国产单机动作游戏,其开发过程不仅涉及了多种编程语言,更是一次技术创新的集中展现。然而,当我们深入探讨其开发语言时,会发现它并非仅依赖于单一的C++,而是融合了多种编程语言的优势,共同铸就了这款游戏的辉煌。
221 0
|
2月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
61 0
|
3月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
3月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
99 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
5天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
15 4
|
5天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
15 4

相关实验场景

更多