当前位置: 首页 > news >正文

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(结构体)示例如下:

#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: 1return 0;
}

对于 union(联合),可以包含以下类型的成员:

数据成员:可以是任何合法的 C++ 数据类型,包括基本数据类型(如整型、浮点型、布尔型)、自定义数据类型(如类、结构体、枚举)等。注意,union 的数据成员共享存储空间,只能存储一个成员的值。

嵌套结构体或联合:可以在 union 内部定义嵌套的 struct 或 union。

union(联合)示例如下:

#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: 42Employee e;e.name = "John";e.age = 30;cout << "Employee: " << e.name << ", " << e.age << " years old" << endl; // 输出: Employee: John, 30 years olde.salary = 5000.0;cout << "Employee: " << e.name << ", salary: " << e.salary << endl; // 输出: Employee: John, salary: 5000return 0;
}

http://www.lryc.cn/news/152801.html

相关文章:

  • 微服务--SkayWalking(链路追踪:国产开源框架)
  • 在Windows 10上部署ChatGLM2-6B:掌握信息时代的智能对话
  • LRU和LFU算法的简单实现
  • OCR多语言识别模型构建资料收集
  • 倍增的经典题目:扩大区间、st表
  • LeetCode——和为K的子数组(中等)
  • Truncation Sampling as Language Model Desmoothing
  • docker安装jenkins
  • 学习pytorch8 土堆说卷积操作
  • pytest自动化测试两种执行环境切换的解决方案
  • 说说TIME_WAIT和CLOSE_WAIT区别
  • Docker的优势
  • C++——string使用
  • 10. selenium API (二)
  • [国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送
  • JavaScript 生成 16: 9 宽高比
  • HTML5之drawImage函数
  • leetcode7.整数反转-Java
  • 操作系统备考学习 day2 (1.3.2 - 1.6)
  • Django-跨域
  • wireshark抓包体验
  • Prometheus+grafana安装配置
  • 长连接和短连接有什么区别?
  • Qt应用开发(基础篇)——输入对话框 QInputDialog
  • C++ struct 笔记(超级详细)
  • Vue基础1:生命周期汇总(vue2)
  • Linux串口驱动
  • java反编译工具jd-gui使用
  • Linux 之 shell 脚本
  • 如何去阅读开源的第三方库的源码