8.3.1 定义联合
我们使用关键字union定义联合。最好的理解方法是看一个定义的示例:
- union shareLD // Sharing memory between long and double
- {
- double dval;
- long lval;
- };
这段代码定义了一个联合类型shareLD,以允许long和double类型的变量占用相同的内存。联合类型名通常被称作标记名(tagname)。我们还没有真正定义过联合的实例,因此此刻还没有任何变量,从这方面来讲该语句与类定义相似。在定义过联合类型之后,我们就可以在声明中定义联合的实例。例如:
- shareLD myUnion;
该语句定义了前面定义的联合类型shareLD的一个实例。我们也可以通过将myUnion包括在联合的定义语句中,来达到定义该实例的目的:
- union shareLD // Sharing memory between long and double
- {
- double dval;
- long lval;
- } myUnion;
为了引用联合的成员,我们要使用直接成员访问运算符(.)与联合实例的名称,就像访问类成员时那样。因此,我们使用下面这条语句,可以将联合实例MyUnion中的变量lval设定为100:
- myUnion.lval = 100; // Using a member of a union
在后面的程序中,使用类似的语句初始化double类型的变量dval将覆盖掉lval。使用联合可以在相同内存中存储不同类型的数值,随之而来的问题是由于联合的特殊工作方式,我们必须有某种方法来确定当前的成员值。为此,通常还需要用一个变量来充当当前值类型指示器。
联合不仅仅限于两个变量之间的共享。如果愿意,我们可以使多个变量共享相同的内存。联合占用的内存大小取决于最大的成员。例如,假设定义了下面这个联合:
- union shareDLF
- {
- double dval;
- long lval;
- float fval;
- } uinst = {1.5};
如图8-2所示,shareDLF的实例将占用8个字节。
|
| (点击查看大图)图 8-2 |
在本例中,我们定义了该联合的实例uinst,并定义了联合的标记名,还将实例初始化为数值1.5。
注意:
当声明实例时,我们只能初始化联合的第一个成员。