C++联合体

来源:互联网 发布:java接收上传图片表单 编辑:程序博客网 时间:2024/06/05 14:35

利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。

当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;

3)此结构空间要大到足够容纳最"宽"的成员;

我们知道,联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。类可以放入联合吗?       我们先看一个例子: 

复制代码
      class Test 
      { 
      
public
          Test():data(
0) { } 
      
private
          
int data; 
      }; 

     typedef union _test 
     { 
              Test test; 
     }UI;
复制代码
   
     编译通不过,为什么呢?
     因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

如何有效的防止访问出错?
       使用联合可以节省内存空间,但是也有一定的风险:通过一个不适当的数据成员获取当前对象的值!例如上面的ch、i交错访问。
       为了防止这样的错误,我们必须定义一个额外的对象,来跟踪当前被存储在联合中的值得类型,我们称这个额外的对象为:union的判别式。
       一个比较好的经验是,在处理作为类成员的union对象时,为所有union数据类型提供一组访问函数。


原创粉丝点击