联合体相关

14 篇文章 0 订阅

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章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值