1. 简介

C++11 中的 union 是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。与 struct 相比,union 只能同时使用一个成员,节省了内存空间。union 的大小等于最大成员的大小。

2. 成员类型

union 的成员可以是任意类型,包括原生数据类型、自定义数据类型、指针等。

下面是几个例子:

union MyUnion {
    int i;
    float f;
    char c;
};
C++

上述代码定义了一个简单的 union,它有三个成员:一个整型 i,一个浮点型 f,一个字符型 c

union Data {
    int i;
    double d;
    char str[20];
};
C++

上述代码定义了一个更复杂的 union,它有三个成员:一个整型 i,一个双精度浮点型 d,一个字符数组 str

3. 成员访问

union 的成员可以直接访问,使用和结构体类似的语法。

下面是几个访问成员的示例:

union MyUnion {
    int i;
    float f;
    char c;
};

int main() {
    MyUnion u;
    u.i = 42;
    u.f = 3.14;
    u.c = 'A';
    return 0;
}
C++

上述代码中,我们创建了一个 union 变量 u,并访问了它的成员。由于 union 只能同时使用一个成员,最后一次访问的成员会覆盖之前的值。在 main 函数中,u.i 被赋值为 42,然后 u.f 被赋值为 3.14,最后 u.c 被赋值为 'A'。

union Data {
    int i;
    double d;
    char str[20];
};

int main() {
    Data data;
    data.i = 42;
    std::cout << data.i << std::endl;   // 输出 42

    data.d = 3.14;
    std::cout << data.d << std::endl;   // 输出 3.14

    std::strcpy(data.str, "Hello");
    std::cout << data.str << std::endl;   // 输出 Hello

    return 0;
}
C++

上述代码创建了一个 union 变量,并访问了它的成员。首先将 i 赋值为 42,然后输出 i 的值,结果为 42。接着将 d 赋值为 3.14,输出 d 的值,结果为 3.14。最后使用 strcpy 函数将字符串 "Hello" 拷贝到 str 中,并输出 str 的值,结果为 Hello。

4. 注意事项

在使用 union 时需要注意以下几点:

1)成员的访问不会进行类型检查,需要自行确保访问的成员类型是正确的。

2)union 的大小等于最大成员的大小,需要注意空间的浪费。

3)在同一个作用域中,只能同时使用一个成员,其他成员的值会被覆盖。因此使用 union 时需要小心操作。

4)union 不能包含引用类型成员,因为引用类型不是一个对象,无法被实例化。

5)union 可以包含包括构造函数和析构函数在内的所有特殊成员函数。但需要注意只能使用 union 的最后一个成员进行初始化,其他成员会被忽略。

以上是对 C++11 中 union 成员的举例分析,union 是一种灵活且节省空间的数据结构,可以根据实际需求选择使用。