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

C++:聚合类、嵌套类、局部类、union类详细介绍与分析

聚合类

(1)What(什么是聚合类)

本质是一个自定义类型的数据结构(结构体或类),但聚合类有以下特性:

  • 所有的成员都是public
  • 没有任何构造函数
  • 没有基类
  • 类内部没有初始值

(2)Why(聚合类的作用)

主要目的是提供一种简单且高效的方式来组织和管理数据。它们通常用于表示简单的 数据结构,如结构体或记录类型,而不涉及复杂的行为和操作

(3)How(如何定义和使用聚合类)

struct Point{double dx;double dy;
};
Point pt01 = {1.1, 2.2};
Point pt02{3.3, 4.4};

嵌套类

(1)What(什么是嵌套类)

定义或声明在类内部的类,它可以访问外部类的私有成员,并能在外部类作用域内使用

(2)Why (嵌套类的作用)

封装和隐藏:将嵌套类进行私有化,实现封装和隐藏
组织和结构化:将一个类嵌套到另一个类,可以清晰的表达两个类之间的关系
实现设计模式:如工厂模式、建造者模式等
命名空间嵌套:有助于避免命名空间冲突

(3)How(如何使用嵌套类)

class Student 
{
private:string name;int age;
...
}
class Grade
{
private:Student student; //Student在类Grade中声明,Student属于类Grade的嵌套类
...
}

局部类

(1)What(什么是局部类)

定义在函数内部或代码块中的类被称为局部类,它的作用域是该函数内部或代码块中

局部类具有以下特性:

  • 不允许存在静态的成员
  • 只允许访问外层作用域的静态变量、枚举和类型名
  • 可以访问全局变量(使用:: ):😃

(2)Why(局部类的作用)

  • 封装:隐藏细节
  • 避免命名冲突:由于只对作用域可见,有助于避免命名冲突,提供更好的隔离性
  • 增加代码的可维护性

union类

(1)What(什么是union类)

本质是一种类,这种类有以下特点:union类可以包含多个成员,但同一时刻只能使用其中一个成员,当其中一个成员被赋值时,其它成员就会变成未定义的状态

(2)Why(union类的作用)

节省内存:当需要存储多种内存数据,但是每次只使用其中一种时
灵活处理异构数据:提供了一种灵活的数据结构,在无需定义多个变量或复杂数据结构的情况下存储和操作不同类型的数据

(3)How(如何使用union类)

struct Rectangle{ float height; float width; }; 
struct Circle { float radius; };
// 定义 union 类 
union Shape {Rectangle rect; Circle circle;
};
float calculateArea(const Shape &shape, string mode) 
{ if (mode == "circle") return 3.1415926 * shape.circle.radius * shape.circle.radius; if (mode == "rect")  return shape.rect.width * shape.rect.height;return 0;
}
// 创建 union 对象 Shape shape;
string mode = "circle"; 
shape.circle.radius = 5;
cout << shape.rect.width << "," << shape.rect.height << endl; //此处会报错
std::cout << "圆的面积:" << calculateArea(shape, mode) << std::endl; // 打印:78.5398 
mode = "rect";
shape.rect.height = 4; 
shape.rect.width = 6;
std::cout << "矩形的面积:" << calculateArea(shape, mode) << std::endl; // 打印:24

(4)匿名的union类

A.What(什么是匿名的union类)

本质:一个union类,它具有以下特性

  • 一旦定义了匿名的union类,编译器就会为它创建一个未命名的对象
  • 作用域内能够访问大匿名union类的所有成员
  • 匿名的union类中的成员必须是public的
  • 匿名的union类中不能定义成员函数,只能作纯数据的结构体使用

B.How(如何使用union类)

class UnionBaseType
{
private: enum {INT, DOUBLE, CHAR, STRING } tp; // 通过匿名枚举类型定义一个变量 tp union {int ival; double dval; string sval; }; // 外层作用域可直接访问匿名 union 中的成员 
public:// 默认构造函数 UnionBaseType() : tp(INT), ival(0) {} // 拷贝构造函数UnionBaseType(const UnionBaseType &obj){tp = obj.tp; copyUnion(obj);}~UnionBaseType(){if (tp == STRING) sval.~string(); }void copyUnion(const UnionBaseType &obj){switch (obj.tp){case UnionBaseType::INT: ival = obj.ival; break; case UnionBaseType::DOUBLE: dval = obj.dval; break; case UnionBaseType::STRING: new (&sval) string(obj.sval); break;// 实现对对象的拷贝 default: break;} // 对 int 成员进行赋值 UnionBaseType &operator=(int ival_) {if (tp == STRING) sval.~string(); tp = UnionBaseType::INT; ival = ival_; return *this;}// 对 double 成员进行赋值 UnionBaseType &operator=(double dval_) {if (tp == STRING) sval.~string();tp = UnionBaseType::DOUBLE; dval = dval_; return *this;}// 对 string 成员进行赋值 UnionBaseType &operator=(const string &sval_) {if (tp == STRING) sval = sval_;else new (&sval) string(sval_); tp = UnionBaseType::STRING; return *this;}// 展示信息 void show() const{if (tp == INT) cout << ival << endl; if (tp == DOUBLE) cout << dval << endl; if (tp == CHAR) cout << cval << endl; if (tp == STRING) cout << sval << endl;}
}

================================================================================

C++知识点总结全系列文章索引:
【C++知识点总结全系列 (01)】:数据类型、数据类型转换和变量
【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结
【C++知识点总结全系列 (03)】:函数(函数参数传递、可变参数、函数返回值等详细介绍)
【C++知识点总结全系列 (04)】:C++类的详细总结与分析
【C++知识点总结全系列 (05)】:IO 类的详细总结和分析
【C++知识点总结全系列 (06)】:STL六大组件详细总结与分析- 配置器、容器、迭代器、适配器、算法和仿函数

【C++知识点总结全系列 (07)】:模板与泛型编程详细总结与分析
【C++知识点总结全系列 (08)】:面向对象编程OOP

相关文章:

C++:聚合类、嵌套类、局部类、union类详细介绍与分析

聚合类 (1)What&#xff08;什么是聚合类&#xff09; 本质是一个自定义类型的数据结构&#xff08;结构体或类&#xff09;&#xff0c;但聚合类有以下特性&#xff1a; 所有的成员都是public没有任何构造函数没有基类类内部没有初始值 (2)Why&#xff08;聚合类的作用&…...

MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统

MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统...

C++:左值/右值引用、移动语义/std::move、万能引用/完美转发std::forward 详解

你能学到 左值 与 右值左值引用 与 右值引用 基本用法与作用拷贝构造函数 与 移动构造函数移动语义 与 std::move万能引用 与 引用折叠完美转发&#xff1a;std::forward 前言 本文代码片段中变量命名规则如下&#xff1a; 小写字母&#xff1a;一般类型的变量&#xff08;非…...

蜂窝物联云平台:一站式服务,智能生活从此开始!

蜂窝云平台 一、PC端展示与管理 GIS地图整合 在GIS地图上精确展示地块&#xff0c;轻松点选查看详细设备信息、实时监控和控制功能&#xff0c;以及基地的全方位介绍。 个性化定制界面 界面布局与功能展示均可按需求定制&#xff0c;打造独一无二的用户体验。 数据集中看板 将…...

【中项】系统集成项目管理工程师-第3章 信息技术服务-3.3服务生命周期

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…...

【iOS】——消息传递底层实现

消息传递是什么 Objective-C是一种动态类型语言&#xff0c;这意味着在编译时并不确定对象的具体类型&#xff0c;而是在运行时决定。消息传递机制允许程序在运行时向对象发送消息&#xff0c;对象再决定如何响应这些消息。 当你通过对象调用方法时&#xff0c;例如像这样[ob…...

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表 一、数据库表空间和数据库之间的关系二、索引表空间和数据库之间的关系三、创建角色四、创建表空间目录五、创建表空…...

恶补,先验分布,后验分布 ,似然估计

恶补&#xff0c;打一遍增加印象 先验分布后验分布&#xff0c;似然估计 声明&#xff1a;仅记录个人学习&#xff0c;并无其他用途。 先验分布 后验分布&#xff0c; 似然估计 隔壁小哥的故事&#xff1a; 隔壁小哥要去15公里外的一个公园里玩&#xff0c;小哥可以选择步行…...

JS之数组中的reduce方法

文章目录 基本语法&#xff1a;callbackFn 的参数:例子1. 数组求和2. 数组求积3. 扁平化数组4. 数组元素计数5. 使用对象解构和展开运算符合并数组中的对象6. 求最大值和最小值 函数组合异步操作中的 reduce总结 reduce 是 JavaScript 中 Array 对象的一个方法&#xff0c;非常…...

在win10上通过WSL和docker安装Ubuntu子系统,并配置Ubuntu可成功使用宿主机GPU

本文主要记录win10系统上,通过WSL的Ubuntu系统以及Docker使用GPU的全部过程。 文章目录 1、 启用hyper-v2、 安装docker3、 安装WSL3.1 安装WSL23.1.1 检查是否安装了WSL23.1.1 安装和配置 WSL 23.2 安装Ubuntu 子系统3.3 检查并修改WSL版本4、docker配置ubuntu20.04 LTS5、下…...

python需要掌握那些语法

1-list数据类型 内置方法查看长度len&#xff08;list&#xff09; 2.array数据类型 查看形状 3.tuple 取出元组 t (1, 2, 3, 4, 5) # 取出第一个元素 2first_element t[0] 3print(first_element) # 输出&#xff1a;1 4 5# 取出第三个元素 6third_element t[2] 7pr…...

CentOS Mysql8 数据库安装

添加mysql yum仓库 这里安装的是8.0版本&#xff0c;如需其他版本在此查看mysql版本列表 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm安装mysql sudo yum install mysql-server …...

新手教程---python-函数(新添加)

一、递归函数 在Python中&#xff0c;递归函数是指一个函数调用自身的过程。递归函数一般包括两个部分&#xff1a;基本情况和递归情况。 基本情况是指在递归过程中终止递归的条件。如果不满足基本情况&#xff0c;递归函数将进入递归情况&#xff0c;调用自身&#xff0c;并缩…...

Windows tasklist命令详解,Windows查看进程

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 tasklist 可以…...

数据结构——线性表(循环链表)

一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点&#xff0c;就使整个单链表形成一 个环&#xff0c;这种头尾相接的单链表称为单循环链表&#xff0c;简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…...

深度剖析机构号矩阵系统:如何根据业务需求做出明智选择

在数字化营销的浪潮中&#xff0c;短视频平台如抖音、快手等已成为品牌传播和用户互动的重要渠道。为了更高效地管理这些平台的账号&#xff0c;机构号矩阵系统应运而生。本文将深度剖析机构号矩阵系统&#xff0c;并探讨如何根据业务需求做出明智的选择。 机构号矩阵系统概述…...

go语言的基础语法

基础语法 与python、vue等类似&#xff0c;go语言也分常量和变量等&#xff0c;常量用const(不可变)和变量var(可变)定义 常量 常量中的数据类型只可以是布尔型、数字型&#xff08;整数型、浮点型和复数&#xff09;和字符串型&#xff0c;值不可更改&#xff0c;表达式只支…...

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块&#xff08;XD-MDEP100&#xff09;是一种用于将Modbus协议转换为Ethernet/IP协议的设备。它可以将Modbus RTU和Modbus TCP两种不同格式的Modbus数据包转换为Ethernet/IP协议的数据包&#xff0c;实现不同厂家的设备之间的数据交换和共享。在汇川P…...

【玩转python】入门篇day11-位运算

1、位运算语法 计算机中所有的数据都是以二进制的形式存储在设备中。即 0、1 两种状态&#xff0c;计算机对二进制数据进行的运算(、-、、/)都是叫位运算&#xff0c;相比在代码中直接使用(、-、、/)运算符&#xff0c;合理的运用位运算更能显著提高代码在机器上的执行效率。 …...

【Gitlab】记一次升级 Gitlab 后 API 失效的问题

背景 前段时间&#xff0c;因内部使用的 Gitlab 版本存在漏洞&#xff0c;需要进行升级&#xff0c;于是乎&#xff0c;将 Gitlab 从 16.6.0 升级到 16.11.3。而我们项目有个接口是用于获取 Gitlab 上的开发人员。 然后&#xff0c;今天&#xff0c;突然发现这个接口获取不到…...

如何在不同设备上高效格式化SD卡

对于任何使用相机、智能手机或电脑的人来说&#xff0c;格式化SD卡都是一项基本技能。无论是清理旧文件为新照片腾出空间&#xff0c;还是修复“卡错误”提示&#xff0c;掌握正确的SD卡格式化方法都能确保其使用寿命和性能。接下来&#xff0c;我们将介绍几种格式化方法。第一…...

AMD Ryzen调试神器:SMU Debug Tool完整指南,轻松掌握CPU性能调优

AMD Ryzen调试神器&#xff1a;SMU Debug Tool完整指南&#xff0c;轻松掌握CPU性能调优 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. …...

NotebookLM免费版vs Pro版实测对比:3大隐藏成本曝光,90%用户都踩了这个坑!

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM定价与性价比分析 NotebookLM 是 Google 推出的面向研究者与知识工作者的 AI 助手&#xff0c;其核心能力围绕文档理解、多源信息整合与可信引用生成。截至 2024 年&#xff0c;NotebookLM 仍…...

4G/5G EPS会话管理机制与QoS优化实践

1. EPS会话管理核心机制解析在4G/5G移动通信系统中&#xff0c;EPS&#xff08;演进分组系统&#xff09;的会话管理架构通过多层抽象实现了精细化的业务流控制。这套机制的核心价值在于&#xff1a;用标准化的方式将不同QoS需求的业务流映射到对应的传输通道上&#xff0c;同时…...

特征工程:从数据到特征

特征工程&#xff1a;从数据到特征 1. 技术分析 1.1 特征工程流程 特征工程是机器学习的核心环节&#xff1a; 特征工程流程数据理解 → 特征提取 → 特征选择 → 特征转换 → 特征验证1.2 特征类型 类型描述处理方法数值型连续数值归一化、标准化分类型类别标签独热编码、…...

AGENTS.md:为AI编码助手定制的项目说明书,提升人机协作效率

1. 项目概述&#xff1a;为什么你的项目需要一个“AI专属说明书”&#xff1f;如果你最近在尝试用GitHub Copilot、Cursor或者Claude Code来辅助开发&#xff0c;大概率遇到过这样的场景&#xff1a;你满怀期待地给AI下达一个指令&#xff0c;比如“帮我给这个React组件添加一个…...

专业指南:高效在ARM设备上运行x86_64程序的完整解决方案

专业指南&#xff1a;高效在ARM设备上运行x86_64程序的完整解决方案 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 你是否正…...

开源首发:DocCenter — 本地 HTML 工作台,治好 AI 时代的文档散落病

Tags&#xff1a;Python aiohttp 开源项目 AI工具 前端工程 全栈 工具分享 一、痛点&#xff1a;AI 时代的文档散落病 &#xff08;对比传统文档管理 vs AI 生成文档的区别&#xff0c;说明为什么 VSCode/Notion 都不合适&#xff09; 二、技术选型&#xff1a;为什么是单 Pyth…...

从手机解锁合法化看DMCA、消费者权利与设备所有权的博弈

1. 从“越狱”到合法化&#xff1a;一场关于设备所有权的消费者权利运动2013年初&#xff0c;如果你在美国买了一部合约机&#xff0c;然后想把它带到另一家运营商使用&#xff0c;你面临的不仅仅是不兼容的技术问题&#xff0c;还可能是一项重罪——最高五年的监禁和五十万美元…...

PADS PCB设计工具的核心优势与应用实践

1. PADS PCB设计工具概述作为一名拥有十年PCB设计经验的工程师&#xff0c;我亲身体验过从Protel到Altium再到Cadence Allegro的各种EDA工具。但当我在2015年首次接触PADS时&#xff0c;它独特的"约束驱动设计"理念和高效的交互式布线引擎立刻吸引了我。PADS&#xf…...