C++之struct和union对比介绍
在C++中,struct和union都是用来定义自定义数据类型的关键字,但它们的作用略有不同。
首先了解一下它们的基本概念:
struct(结构体):struct 是一个用户自定义的数据类型,可以包含多个不同类型的成员变量,可以包含函数。这些成员变量在结构体中是独立的,它们分别占用独立的内存空间。结构体中的成员可以通过指定的访问权限(public, private, protected)进行访问控制。
union(联合体):union 也是一个用户自定义的数据类型,但不能包含函数。它的成员共享同一块内存空间。这意味着,union 中的所有成员变量都位于同一个内存区域,且内存空间的大小由最长的成员变量决定。
如果需要定义一个包含多个具有不同数据类型的成员的数据类型,可以使用struct关键字。例如,一个学生信息的数据类型,包含学号、姓名和成绩等成员,可以用struct来定义:
struct Student {
int id;
string name;
float grade;
};
使用struct定义的类型非常直观,也很容易操作,不需要过多的安全性考虑。
如果需要定义一个可以共享内存的数据类型,可以使用union关键字。union中的不同成员可以在同一时间只有一个是有效的,因为它们共用同一块内存。例如,定义一个可以同时存储int、float和char类型数据的数据类型可以用union定义:
union Data {
int i;
float f;
char str[20];
};
使用union关键字定义的类型具有较高的危险性,因为它的成员共享同一块内存,如果使用不当,容易出现数据混乱等问题,需要特别注意安全性。
在 C++ 中,struct 和 union 的成员默认是公共的(public),但是可以根据需要设置访问权限,例如将某些成员设置为私有(private)或受保护(protected)。具体的访问权限设置通过在成员声明时添加访问修饰符来实现。
struct 可以有函数成员,union不能包含函数成员。
因此,struct和union的使用还是根据具体情况而定,需要根据问题的实际需求进行选择。
对于 struct(结构体),它的成员可以是以下类型:
数据成员:可以是任何合法的 C++ 数据类型,包括基本数据类型(如整型、浮点型、布尔型)、自定义数据类型(如类、结构体、枚举)等。
函数成员(成员函数):在 struct 内部定义的函数,可以用于操作 struct 的数据。函数成员可以访问 struct 的私有成员和保护成员。
静态成员:可以是静态数据成员或静态函数成员。静态数据成员是 struct 类型的对象共享的数据,静态函数成员是不依赖于具体对象的函数。
struct(结构体)示例如下:
cpp
#include <iostream>
using namespace std;
struct Point {
int x;
int y;
void print() {
cout << "Point: (" << x << ", " << y << ")" << endl;
}
static int count;
static void incrementCount() {
count++;
}
};
int Point::count = 0;
int main() {
Point p1 = {3, 4};
p1.print(); // 输出: Point: (3, 4)
Point::incrementCount();
cout << "Point count: " << Point::count << endl; // 输出: Point count: 1
return 0;
}
对于 union(联合),可以包含以下类型的成员:
数据成员:可以是任何合法的 C++ 数据类型,包括基本数据类型(如整型、浮点型、布尔型)、自定义数据类型(如类、结构体、枚举)等。注意,union 的数据成员共享存储空间,只能存储一个成员的值。
嵌套结构体或联合:可以在 union 内部定义嵌套的 struct 或 union。
union(联合)示例如下:
cpp
#include <iostream>
using namespace std;
union Data {
int i;
float f;
char c;
};
struct Employee {
string name;
union {
int age;
float salary;
};
};
int main() {
Data d;
d.i = 42;
cout << "Data value: " << d.i << endl; // 输出: Data value: 42
Employee e;
e.name = "John";
e.age = 30;
cout << "Employee: " << e.name << ", " << e.age << " years old" << endl; // 输出: Employee: John, 30 years old
e.salary = 5000.0;
cout << "Employee: " << e.name << ", salary: " << e.salary << endl; // 输出: Employee: John, salary: 5000
return 0;
}