• 39、C++ Primer 4th笔记,特殊工具与技术,联合(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章。

  • 相关阅读:
    TF-IDF
    线性回归梳理
    snappy 在linux安装及使用
    Hbase 写入机制详解与MVCC机制
    phoenix二级索引源码阅读
    利用SET工具制造钓鱼网站
    jQuery框架漏洞全总结及开发建议
    DDE注入(CSV)漏洞原理及实战案例全汇总
    burp插件大全 漏洞扫描 waf绕过 sql XSS 命令注入 fuzzer
    点击劫持(ClickJacking)漏洞挖掘及实战案例全汇总
  • 原文地址:https://www.cnblogs.com/mydomain/p/2055201.html
Copyright © 2020-2023  润新知