联合----union

定义:

  union 是用户定义的类型,其中所有成员都共享同一个内存位置。 这意味着在任何给定时间,联合都不能包含来自其成员列表的多个对象。 这还意味着无论联合具有多少成员,它始终仅使用足以存储最大成员的内存。

  即联合只保存最后写入的那个成员。赋入新值则冲去旧值。

  所以一定要小心,因为这是由你负责确保:始终访问的是写入的最后一个成员。

  

  联合不能存储引用。 联合不支持继承,因此联合本身不能用作基类、继承自另一个类或具有虚函数。

  联合可以有成员函数。

好处:
  具有大量对象和/或内存有限时,联合可用于节省内存。 

  而且可以随时改变它的值,这些值是不同类型的。

声明:

 union [name] { member-list };

示例:

// declaring_a_union.cpp
union RecordType    // Declare a simple union type
{
    char   ch;
    int    i;
    long   l;
    float  f;
    double d;
    int *int_ptr;
}; 
int main()
{
    RecordType t;
    t.i = 5; // t holds an int
    t.f = 7.25 // t now holds a float 
}

无限制的联合 (C++11)

  在 C++03 及更低版本中,联合可以包含具有类类型的非静态数据成员(class),只要该类型没有用户提供的构造函数、析构函数或赋值运算符即可。

  在 C++11 中,消除了这些限制。 如果在联合中包含这样一个成员,则编译器会自动将不是用户提供的任何特殊成员函数标记为已删除。 如果联合是类或结构中的匿名联合,则类或结构的不是用户提供的任何特殊成员函数都会标记为已删除。 

 

匿名联合:

  union { member-list } 

  匿名联合中声明的名称可直接使用,就像非成员变量一样。 因此,匿名联合中声明的名称必须在周边范围中是唯一的。

 

  除了联合成员数据中列出的限制之外,匿名联合还受其他限制:

    • 如果在文件或命名空间范围内声明联合,则还必须将它们声明为“静态的”。

    • 它们可以只具有公共成员;匿名联合中的私有成员和受保护的成员会生成错误。

    • 它们不能具有函数成员。

posted @ 2016-05-22 15:53  shinymood  阅读(356)  评论(0编辑  收藏  举报