结构体与联合的异同

信息学奥赛   2023-11-13 16:14   233   0  

在C++中,结构体(struct)联合(union)「也叫共用体」 是用户自定义的数据类型。它们都可以存储多种类型的数据,但是处理方式有所不同。它们的主要区别在于它们如何在内存中分配和存储这些数据。

结构体 struct

结构体允许你将多个变量组合在一起,这些变量可以是不同类型的,它们在内存中是连续存储的。结构体的总大小等于其所有成员的大小之和。

以下是一个简单的 struct 示例:

#include <iostream>
using namespace std;

struct Example {
    int x;
    double y;
    char z;
};

int main() {
    Example e;

    e.x = 10;
    e.y = 20.5;
    e.z = 'a';

    cout << "x: " << e.x << endl;
    cout << "y: " << e.y << endl;
    cout << "z: " << e.z << endl;

    return 0;
}

在这个例子中,我们定义了一个名为 Example 的结构体,它有三个成员:xy 和 z。然后在 main 函数中,我们创建了一个 Example 类型的变量 e,并给它的每个成员赋值,然后输出。

联合 union

联合也允许将多个变量组合在一起,这些变量可以是不同类型的。然而,不像结构体,联合的所有成员共享同一块内存。联合的大小等于其最大的成员的大小。因此,在同一时间,只有一个成员可以有值。

以下是一个简单的 union 示例:

#include <iostream>
using namespace std;

union Example {
    int x;
    double y;
    char z;
};

int main() {
    Example e;

    e.x = 10;
    cout << "x: " << e.x << endl;

    e.y = 20.5;
    cout << "y: " << e.y << endl;

    e.z = 'a';
    cout << "z: " << e.z << endl;
    
    // 下面两个值已经被e.z覆盖,无法保存原来的数值
    cout << "x: " << e.x << endl;
    cout << "y: " << e.y << endl;

    return 0;
}

在这个例子中,定义了一个名为 Example 的联合,它也有三个成员:xy 和 z。然后在 main 函数中,创建了一个 Example 类型的变量 e,并给它的每个成员逐一赋值,然后输出。输出时你会注意到,只有最后赋值的成员 z 能够保持它的值,这是因为所有成员都共享同一块内存空间,后面的赋值会覆盖前面的值。(即便偶尔能输出原来的值是因为覆盖部分没有影响到原来的内存空间)

总结

  • 结构体的每个成员都有自己的内存空间,它们的大小是所有成员大小之和。这意味着在同一时间,可以同时访问所有的成员。
  • 联合的所有成员共享同一块内存空间,它的大小等于最大的成员的大小。这意味着在同一时间,只能访问其中的一个成员。

此外,在 C++ 中,结构体和联合都可以包含函数(包括构造函数和析构函数),而在 C 语言中,结构体和联合只能包含数据。