联合----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 } 

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

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

    • 如果在文件或命名空间范围内声明联合,则还必须将它们声明为“静态的”。
    • 它们可以只具有公共成员;匿名联合中的私有成员和受保护的成员会生成错误。
    • 它们不能具有函数成员。
时间: 2024-11-07 23:42:12

联合----union的相关文章

SQL SERVER 2012 第四章 连接 JOIN语句的早期语法结构 & 联合UNION

1/内部连接的早期语法结构 INNER JOIN SELECT * FROM Person.Person JOIN HumanResources.Employee ON Person.Person.ID = HumanResources.Employee.ID 等价于早期的也就是老版本的 SELECT * FROM Person.Person,HumanResources.Employee WHERE Person.Person.ID = HumanResources.Employee.ID 2

结构体struct 与 联合union

1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{               //struct为关键字,“结构体名”为用户定义的类型标识. 数据类型1 成员名1;          //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型. 数据类型2 成员名2; ... 数据类型n 成员名n; }; 1.2 结构体的内存分配(方法一) 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉

C语言学习015:联合(union)与枚举(enum)

联合 联合和结构的区别是,结构会为每个字段申请一片内存空间,而联合只是申请了一片内存空间然后所有字段都会保存到这片空间中,这片空间的大小由字段中最长的决定,下面我们就开始定义一个联合 1 //联合的定义 2 typedef union{ 3 short count; 4 float weight; 5 float volume; 6 } quantity; 联合的使用 我们可以通过很多的方式为联合赋值 1 typedef struct{ 2 const char* color; 3 quanti

C语言-枚举(enum)和联合(union)

使用enum进行定义 /* 枚举类型演示 */ #include <stdio.h> int main() { enum /*季节*/ {CHUN, XIA = 5, QIU, DONG}; printf("QIU是%d\n", QIU); } 使用union联合进行定义 /* 联合演示 */ #include <stdio.h> typedef union{ int val; float fval1; } tmp; int main(){ tmp utmp =

C++-结构体(struct),联合(union),枚举(enum)

使用struct定义结构体,使用Teacher t = {"", "", ""} 进行初始化操作 /* 结构体 */ #include <iostream> using namespace std; struct Teacher{ char name[20]; int age; double salary; void who(void) { cout << "名字是" << name <

c语言联合union的使用用途

在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处. 我在网上看到还有其他的用途: 1.分离高低字节 这个需要结合cpu大小端来判断,原文如下: 这样的操作,而一个除法消耗四个机器周期,取余也需要进行一系列复杂的运算,如果在短时间内需要进行很多次这样的运算无疑会给程序带来巨大的负担. 其实进行这些操作的时候我们需要的仅仅是高低字节的数据分离而已,这样利用联合体我们很容易降低这部分开销. 联合体内数据是按地址对齐的.具体是高位数据还是低位数据要看平台的大小端模式,51是大端,stm

枚举、联合

枚举enum.联合union成员共用一个变量缓冲区 enum是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型 有些变量的取值被限定在一个有限的范围内 枚举值是常量不是变量,不能再对它赋值 0,1,2,3,4 - enum weekday{sun,mon,tue,wed,thu,fri,sat}; weekday a, b; 或 enum weekday{sun,mon,tue,wed,thu,fri,sat}a,b; 或 enum {sun,mon,tue,wed,thu,

C语言union(联合体、共用体)及应用

C语言union(联合体.共用体)及应用 在结构体(变量)中,结构的各成员顺序排列存储,每个成员都有自己独立的存储位置.联合(union)变量的所有成员共享同片存储区/内存.因此联合变量每个时刻里只能保存它的某一个成员的值. 联合变量也可以在定义时直接初始化,但这个初始化只能对第一个成员进行.例如下面的描述定义了一个联合变量,并进行了初始化. 1 uunion data 2 { 3 char n; 4 float f; 5 }; 6 union data u1 = {3}; //只有u1.n被初

C和指针 第10章 结构和联合 (二)

结构体传值: 结构体也是标量,像字符和整数一样,可以传递给一个函数,但是传入整个结构体效率很低,可以传入指向结构体的指针来提高效率.如果不希望程序对结构体变量改变可以加入const关键词. typedef struct { int id; int num; char name[100]; } Produts; //传入指针,加const修饰,防止程序修改 void test(Produts const *ptr); 位段: 结构体可以实现位段,位段的声明和结构体类型,但是成员是多个位的字段,不同