C++之struct和union对比介绍

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;
}
相关推荐
无 证明28 分钟前
new 分配空间;引用
数据结构·c++
别NULL5 小时前
机试题——疯长的草
数据结构·c++·算法
CYBEREXP20086 小时前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
yuanbenshidiaos6 小时前
c++------------------函数
开发语言·c++
yuanbenshidiaos6 小时前
C++----------函数的调用机制
java·c++·算法
tianmu_sama6 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
羚羊角uou7 小时前
【C++】优先级队列以及仿函数
开发语言·c++
姚先生977 小时前
LeetCode 54. 螺旋矩阵 (C++实现)
c++·leetcode·矩阵
FeboReigns7 小时前
C++简明教程(文章要求学过一点C语言)(1)
c语言·开发语言·c++
FeboReigns7 小时前
C++简明教程(文章要求学过一点C语言)(2)
c语言·开发语言·c++