【C++ | 复合类型】结构体、共用体、枚举、引用

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
    • ✨1.1
    • ✨1.2
  • 🎄二、结构体(struct)
  • 🎄三、共用体(union)
  • 🎄四、枚举类型(enum)
  • 🎄五、引用
  • 🎄六、总结


在这里插入图片描述

在这里插入图片描述

🎄一、概述

本文主要介绍C++的复合类型,并且重点地介绍与C语言有区别的复合类型。C语言的复合类型主要有5种:数组、结构体、共用体、枚举类型、指针。而C++在C语言的基础上增加了两个复合类型:引用、类。

下面是C++的7种复合类型:

  1. 数组:基本与C语言没差别;
  2. 结构体(struct)
  3. 共用体(union)
  4. 枚举类型(enum)
  5. 指针
  6. 引用

其中数组、指针类型基本和C语言差不多,以前介绍C语言的文章有介绍过,这里不赘述,而类的内容很多,会在以后的文章来介绍,所以本文就介绍剩余的4种复合类型:①结构体(struct)、②共用体(union)、③枚举类型(enum)、④引用。

【C语言 | 数组】C语言数组详解(经典,超详细)
【C语言 | 指针】C指针详解(经典,非常详细)

✨1.1

✨1.2


在这里插入图片描述

🎄二、结构体(struct)

结构体可以存储多种类型的数据,从而将数据的表示合并在一起。

结构体是用户定义的类型,而结构体声明定义了这种类型的数据属性。 定义了类型后,便可以创建这种类型的变量。

在这里插入图片描述
标识符 inflatable 是这种数据格式的名称, 因此新类型的名称为 inflatable。

注意:C++允许在声明结构体变量时省略关键字 struct,而C语言则需要带关键字 struct 这种变化强调的是, 结构体声明定义了一种新类型。

C++使用户定义的类型与内置类型尽可能相似。 例如, 可以将结构作为参数传递给函数, 也可以让函数返回一个结构。 另外, 还可以使用赋值运算符(=) 结构赋给另一个同类型的结构, 这样结构中每个成员都将被设置为另一个结构中相应成员的值, 即使成员是数组。

🌰举例子:

// 02_struct.cpp
// g++ 02_struct.cpp 
#include <iostream>

using namespace std;

struct info_t
{
	int age;
	int height;
};

int main()
{
	struct info_t	XiaoMing;	// C语言用法
	info_t 			XiaoHong;	// 1、C++声明、定义变量不需要 struct 关键字
	
	XiaoMing.age = 18;
	XiaoMing.height = 179;
	
	XiaoHong = XiaoMing;		// 2、使用 = 给另一个同类型结构体赋值
	
	cout << "XiaoMing: age=" << XiaoMing.age << " height=" << XiaoMing.height <<endl;
	cout << "XiaoHong: age=" << XiaoHong.age << " height=" << XiaoHong.height <<endl;
	return 0;
}

运行结果如下:
在这里插入图片描述


在这里插入图片描述

🎄三、共用体(union)

共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。

共用体的用途之一是, 当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。

匿名共用体(anonymous union) 没有名称, 其成员将成为位于相同地址处的变量。 显然, 每次只有一个成员是当前的成员:

struct widget
{
	char brand[20];
	int type;
	union
	{
		long id_num;
		char id_char[20];
	}
};

注意:C++允许在声明共用体变量时省略关键字 union,而C语言则需要带关键字 union

🌰举例子:

// 02_union.cpp
// g++ 02_union.cpp
#include <iostream>
#include <cstring>

using namespace std;

union info_t
{
	char	c;
	int		i;
};

struct widget
{
	char	brand[20];
	int		type;
	union	// 3、匿名共用体
	{
		long id_num;
		char id_char[20];
	};
};

int main()
{
	union info_t	XiaoMing;	// C语言用法
	info_t 			XiaoHong;	// 1、C++声明、定义变量不需要 union 关键字
	
	memset(&XiaoMing, 0, sizeof(XiaoMing));
	memset(&XiaoHong, 0, sizeof(XiaoHong));
	
	XiaoMing.c = 'A';
	
	XiaoHong = XiaoMing;		// 2、使用 = 给另一个同类型共用体赋值
	
	cout << "XiaoMing: c=" << XiaoMing.c << " i=" << XiaoMing.i <<endl;
	cout << "XiaoHong: c=" << XiaoHong.c << " i=" << XiaoHong.i <<endl;
	
	widget prize;
	prize.type = 1;
	prize.id_num = 666666;
	cout << "prize: id_num=" << prize.id_num <<endl;
	return 0;
}

运行结果:
在这里插入图片描述


在这里插入图片描述

🎄四、枚举类型(enum)

C++的枚举类型(enum)提供了另一种创建符号常量的方式, 这种方式可以代替 const。它还允许定义新类型,但必须按严格的限制进行。 使用 enum 的句法与使用结构相似。 例如, 请看下面的语句:

enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

这条语句完成两项工作:
1、让 spectrum 成为新类型的名称; spectrum 被称为枚举(enumeration),就像 struct 变量被称为结构体—样。
2、将 red、orange、yellow 等作为符号常量, 它们对应整数值 0 7。 这些常量叫作枚举量(enumerator)。

在默认情况下, 将整数值赋给枚举量, 第一个枚举量的值为 0, 第二个枚举量的值为 1, 依次类推。但是,可以使用赋值运算符来显式地设置枚举量的值: enum bits{one = 1, two = 2, four = 4, eight = 8};。指定的值必须是整数。 也可以只显式地定义其中一些枚举量的值:enum bigstep{first, second = 100, third};,后面没有被初始化的枚举量的值将比其前面的枚举量大 1。

枚举变量具有一些特殊的属性:
1、在不进行强制类型转换的情况下, 只能将定义枚举时使用的枚举量赋给这种枚举的变量。
2、对于枚举, 只定义了赋值运算符。 具体地说, 没有为枚举定义算术运算。
3、枚举量是整型, 可被提升为 int 类型, 但 int 类型不能自动转换为枚举类型,如:int i = red
4、如果打算只使用常量, 而不创建枚举类型的变量, 则可以省略枚举类型的名称, 如下面的例子所示:
enum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

枚举的取值范围:

  • 上限:大于枚举的最大值的最小的2的幂次方的数减一。如enum bigstep{first, second = 100, third};中,枚举最大值是101,大于101的2的幂次方的数是128,所以这个枚举的上限是127。
  • 下限:如果枚举最小值不小于 0, 则取值范围的下限为 0;如果小于0,则是小于枚举的最小值的最大的2的幂次方的数加一。如,最小值是-6,比-6小的最大2的幂次方数是-8,所以该枚举下限是-7。

在这里插入图片描述

🎄五、引用

在这里插入图片描述

🎄六、总结

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/579162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解冯诺依曼体系结构

文章目录 冯诺依曼体系结构概念冯诺依曼体系结构的优势冯诺依曼体系结构的现实体现 冯诺依曼体系结构概念 冯诺依曼体系结构也称普林斯顿结构&#xff0c;是现代计算机发展的基础。它的主要特点是“程序存储&#xff0c;共享数据&#xff0c;顺序执行”&#xff0c;即程序指令和…

芋道微服务功能介绍(限免)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 第一章 芋…

Datart 扩装下载功能之PDF和图片下载

Datart 扩装下载功能之PDF和图片下载 首先下载依赖 yum install mesa-libOSMesa-devel gnu-free-sans-fonts wqy-zenhei-fonts -y 然后下载安装chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本号 google…

vscode使用EditorConfig进行项目配置

安装 EditorConfig for VS Code 插件&#xff0c;该插件会自动读取项目的 .editorconfig 文件&#xff0c;对项目进行配置。 该文件支持属性&#xff1a; indent_style&#xff1a;缩进风格&#xff0c;可配置项&#xff1a;tab&#xff0c;spaceindent_size&#xff1a;缩进…

前端学习<四>JavaScript——54-原型链

常见概念 构造函数 构造函数-扩展 原型规则和示例 原型链 instanceof 构造函数 任何一个函数都可以被 new&#xff0c;new 了之后&#xff0c;就成了构造方法。 如下&#xff1a; function Foo(name, age) {this.name name;this.age age;//retrun this; //默认有这…

数据聚类:Mean-Shift和EM算法

目录 1. 高斯混合分布2. Mean-Shift算法3. EM算法4. 数据聚类5. 源码地址 1. 高斯混合分布 在高斯混合分布中&#xff0c;我们假设数据是由多个高斯分布组合而成的。每个高斯分布被称为一个“成分”&#xff08;component&#xff09;&#xff0c;这些成分通过加权和的方式来构…

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第二部分&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2…

GPU:使用gpu-burn压测GPU

简介&#xff1a;在测试GPU的性能问题时&#xff0c;通常需要考虑电力和散热问题。使用压力测试工具&#xff0c;可以测试GPU满载时的状态参数&#xff08;如温度等&#xff09;。gpu_burn是一个有效的压力测试工具。通过以下步骤可以进行测试。 官网&#xff1a; http://www…

Linux——终端

一、终端 1、终端是什么 终端最初是指终端设备&#xff08;Terminal&#xff09;&#xff0c;它是一种用户与计算机系统进行交互的硬件设备。在早期的计算机系统中&#xff0c;终端通常是一台带有键盘和显示器的电脑&#xff0c;用户通过它输入命令&#xff0c;计算机在执行命…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点&#xff1a; 独特性&#xff1a;独一无二&#xff0c;无法简单重复过去的做法。 临时性&#xff1a;项目有明确的起点和终点&…

(22408)武汉大学计算机专硕初试备考经验贴

首先谈一下&#xff0c;写这篇文章的初衷。 我相信考武大计算机的同学都是优秀的&#xff0c;应该有自己的备考方法&#xff0c;所以这里并不介绍具体怎么备考某一科目。 计算机考研热度较高&#xff0c;备考不易&#xff0c;这里将自己备考过程中遇到的问题&#xff0c;分享…

人工智能|推荐系统——推荐大模型最新进展

近年来,大语言模型的兴起为推荐系统的发展带来了新的机遇。这些模型以其强大的自然语言处理能力和丰富的知识表示,为理解和生成复杂的用户-物品交互提供了新的视角。本篇文章介绍了当前利用大型语言模型进行推荐系统研究的几个关键方向,包括嵌入空间的解释性、个性化推荐的知…

中国人工智能奠基人张钹院士:走进“无人区” 探索人工智能之路

4月23日&#xff0c;中国人工智能奠基人、清华大学计算机系教授、中国科学院院士张钹在“人文清华”讲坛作专题分享。在2小时的直播中&#xff0c;张钹以《走进“无人区” 探索人工智能之路》为主题&#xff0c;回顾人工智能的发展历程&#xff0c;为大家解读ChatGPT的意义&…

新手Pytorch入门笔记-概念入门

文章目录 1.主干权重和模型权重2.超参数2.1 ReLU(inplaceTrue)2.2 交叉熵损失CrossEntropyLoss 3.反向传播4.优化器4.1 optimizer.zero_grad()5.卷积6.Batch Normalization7.U-Net结构 这章节比较枯燥&#xff0c;都是大段文字 1.主干权重和模型权重 主干权重&#xff08;Back…

GateWay具体的使用之全链路跟踪TraceId日志

1.创建全局过滤器&#xff0c;在请求头上带入traceId参数&#xff0c;穿透到下游服务. package com.by.filter;import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.jwt.JWTValidator;…

vue做导入导出excel文档

系统中经常会遇到要实现批量导入/导出数据的功能&#xff0c;导入就需要先下载一个模板&#xff0c;然后在模板文件中填写内容&#xff0c;最后导入模板&#xff0c;导出就可能是下载一个excel文件。 1、导出 新建一个export.js文件如下&#xff1a; import {MessageBox,Mes…

【Git】分支管理的基本操作

文章目录 理解分支分支的本质主分支创建分支切换分支合并分支fast-forward模式删除分支合并冲突问题 理解分支 分支管理是git的一个核心功能。在git中&#xff0c;分支是用来独立开发于某个功能或者修复某个bug的一种方式。就像是《火影忍者》中的鸣人使用分身去妙蛙山修炼&am…

ansible-copy用法

目录 概述实践不带目录拷贝带目录拷贝 概述 ansible copy 常用用法举例 不带目录拷贝&#xff0c;拷贝的地址要写全 带目录拷贝&#xff0c;拷贝路径不要写在 dest 路径中 实践 不带目录拷贝 # with_fileglob 是 Ansible 中的一个循环关键字&#xff0c;用于处理文件通配符匹…

【强训笔记】day4

NO.1 思路&#xff1a;利用滚动数组&#xff0c;迭代一个Fibonacci数列&#xff0c;给出三个值进行循环迭代&#xff0c;当n<c时&#xff0c;说明n在b和c之间&#xff0c;这里只需要返回c-n和n-b的最小值就可以了。 代码实现&#xff1a; #include<iostream>using n…

BLIP-2论文精读

概述 由于大规模模型的端到端训练&#xff0c;视觉和语言预训练的成本越来越高&#xff0c;BLIP-2是一种通用且高效的预训练策略&#xff0c;可以从现成的冻结的预训练图像编码器和冻结的大型语言模型引导视觉语言预训练。 模型主体框架 BLIP-2采用了一个轻量级的查询转换器Q…