1. 简介

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

2. 成员类型

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

下面是几个例子:

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

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

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

上述代码定义了一个更复杂的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;
}

上述代码中,我们创建了一个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;
}

上述代码创建了一个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是一种灵活且节省空间的数据结构,可以根据实际需求选择使用。