C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(1)
1、表格处理程序示例
表格处理程序是一个二维的“细胞”网格,每个格子包含了一个数字或者字符串。专业的表格处理程序比如微软的Excel提供了执行数学运算的能力,比如计算格子中的值的和。表格处理程序示例无意挑战微软的市场地位,但是对于演示类与对象还是很有帮助的。
表格处理程序使用了两个基础的类:Spreadsheet与SpreadsheetCell。每个Spreadsheet对象包含了SpreadsheetCell对象。还有,SpreadsheetApplication类管理Spreadsheet集合。
这里展示了SpreadsheetCell的不同版本,是为了逐步地介绍相关概念。这样的话,不同的对类的尝试并不总是给出了写出该类的每个特点的最好方式。需要特别指出的是,前面的例子省略了重要的属性,该属性通常应该被包含,但是清空没有介绍到。在本章的一开始你就可以下载其最终版本。
2、书写类
当你写一个类时,要指定其行为,或者叫做成员函数,会应用于该类的对象,指定属性,或者叫做成员变量,每一个对象都应该包含的。
在书写类的过程中有两个部件 :定义类本身与定义其成员函数。
2.1、类定义
首先我们尝试一个简单的SpreadsheetCell类在spreadsheet_cell模块中,每一个格子只包含一个单独的数字:
export module spreadsheet_cell;
export class SpreadsheetCell
{
public:void setValue(double value);double getValue() const;private:double m_value{ 0 };
};
第一行指出这是一个叫做spreadsheet_cell的模块的定义。每一类的定义都是以class关键字开始后接类的名字。如果类定义在一个模块中,该类一定要import进来才可见,定义时一定要在class关键字之前加上export。类的定义就是声明并且以分号结束。
类的定义通常在一个其名字的文件中。例如,SpreadsheetCell类定义在一个叫做SpreadsheetCell.cppm的文件中。有些编译器要求使用特定的扩展名;有些则不要求。
2.1.1、类成员
类可以有多个成员。成员可以是成员函数(顺序为函数,构造函数,析构函数),成员变量(也叫做数据成员),成员枚举,类型别名,嵌套类,等等。
这两行看起来像函数原型的声明了类支持的成员函数:
void setValue(double value);double getValue() const;
用const声明一个不改变对象的成员函数总是一个不错的主意,就像getValue()成员函数。
看起来像是一个变量声明的这一行声明了类的成员变量:
double m_value{ 0 };
类定义了应用的成员函数与数据成员。它们只应用于类的特定的实例,那就是对象。有一个例外就是静态成员,这个我们以后再讨论。类定义了概念;对象包含了实际的数据位。这样的话,每个对象包含了m_value数据成员的值。成员函数实现在所有对象之间共享。类可以包含任意数量的成员函数与数据成员。数据成员与成员函数不能重名。
2.1.2、访问控制
类中的每个成员都有三个访问说明符的一个:public,private,或者protected。protected访问说明符以后再解释。访问说明符应用于声明后面的所有的成员,直到下一个访问说明符。在SpreadsheetCell类中,setValue()与getValue()成员函数具有public访问权限,而m_value数据成员具有private访问权限。
类的缺省的访问说明符为private:所有的第一个访问说明符之前的成员声明都具有private访问权限。例如,把public访问说明符移到setValue()成员函数声明之后,setValue()成员函数就不是public访问权限而是private访问权限了。
export class SpreadsheetCell
{void setValue(double value);
public:double getValue() const;private:double m_value{ 0 };
};
在C++中,struct可以像class一样拥有成员函数。实际上,只有一个不同,struct的缺省访问说明符为public,而class的缺省访问说明符是private。
例如,SpreadsheetCell类可以用struct重写如下:
export struct SpreadsheetCell
{void setValue(double value);double getValue() const;
private:double m_value;
};
然而,这样做是非常不方便的。struct通常用于只需要公共访问的数据成员集合时,并且没有成员函数。下面的例子就是一个简单的struct来保存2-D的点坐标:
export struct Point
{double x;double y;
};
2.1.3、声明顺序
声明成员与访问说明符可以用任何顺序:c++没有任何限制,比如成员函数要在数据成员前面,或者public要在private前面。还有,访问说明符可以重复。例如,SpreadsheetCell定义可以看起来像这样:
export class SpreadsheetCell
{
public:void setValue(double value);
private:double m_value;
public:double getValue() const;
};
然而,语法是语法,美观易读也是我们写出优雅程序的追求。为了清晰,将基于访问说明符的声明进行分组,在这些声明中,对成员函数与数据成员进行分组,都不失为一个好主意。
2.1.4、类内成员初始化
数据成员可以在类定义时直接初始化。例如,SpreadsheetCell类可以缺省在类定义时直接初始化m_value为0,如下:
export class SpreadsheetCell
{// Remainder of the class definition omitted for brevity
private:double m_value{ 0 };
};
总是推荐要对类的数据成员进行初始化。
相关文章:
C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(1)
1、表格处理程序示例 表格处理程序是一个二维的“细胞”网格,每个格子包含了一个数字或者字符串。专业的表格处理程序比如微软的Excel提供了执行数学运算的能力,比如计算格子中的值的和。表格处理程序示例无意挑战微软的市场地位,但是对于演示…...
es6中set和map的区别
在ES6(ECMAScript 2015)中,Set 和 Map 是两种新的集合类型,它们提供了更高级的数据结构来存储唯一值或键值对集合。尽管它们在功能上有些相似,但它们在用途和内部机制上存在一些关键区别。 1. 基本概念 Set࿱…...
高级实时通信:基于 Python 的 WebSocket 实现与异步推送解决方案
高级实时通信:基于 Python 的 WebSocket 实现与异步推送解决方案 目录 🟢 WebSocket 协议概述🔵 在 FastAPI 中实现 WebSocket🟣 Django Channels 实现异步实时通信🔴 使用 Redis 实现实时推送 🟢 1. WebS…...
大二上学期详细学习计划
本学习完成目标: 项目: 书籍:《mysql必知必会》《java核心技术卷》(暂时)加强JavaSE的学习,掌握Java核心Mysqlsql(把牛客上的那50道sql语句题写完)gitmaven完成springboot项目&…...
Kafka【十四】生产者发送消息时的消息分区策略
【1】分区策略 Kafka中Topic是对数据逻辑上的分类,而Partition才是数据真正存储的物理位置。所以在生产数据时,如果只是指定Topic的名称,其实Kafka是不知道将数据发送到哪一个Broker节点的。我们可以在构建数据传递Topic参数的同时ÿ…...
SQL优化:执行计划详细分析
视频讲解:SQL优化:SQL执行计划详细分析_哔哩哔哩_bilibili 1.1 执行计划详解 id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1.1.1 ID 【概…...
Android Studio -> Android Studio 获取release模式和debug模式的APK
Android Studio上鼠标修改构建类型 Release版本 激活路径:More tool windows->Build Variants->Active Build Variant->releaseAPK路径:Project\app\build\intermediates\apk\app-release.apk Debug版本 激活路径:More tool w…...
基于 SpringBoot 的实习管理系统
专业团队,咨询送免费开题报告,大家可以来留言。 摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,实习管理也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越…...
vmware workstation 17 linux版
链接: https://pan.baidu.com/s/1F3kpNEi_2GZW0FHUO-8p-g?pwd6666 提取码: 6666 1 先安装虚拟机 不管什么错误 先安装vmware workstation 17 2 编译 覆盖安装vmware-host-modules-workstation-17.5.1 只需这样就可以 # sudo apt install dkms build-essential bc iw…...
Windows环境本地部署Oracle 19c及卸载实操手册
前言: 一直在做其他测试,貌似都忘了Windows环境oracle 19c的部署,这是一个很早很早的安装记录了,放上来做个备录给到大家参考。 Oracle 19c:进一步增强了自动化功能,并提供了更好的性能和安全性。这个版本在自动化、性能和安全性方面进行了重大改进,以满足现代企业对数…...
MapStruct介绍
一、MapStruct 1.1何为MapStruct 要说这个东西,其实和我们刚刚讲到的Lombok相类似。其是由我们的源代码加上MapStruct经过编译后得到.class文件,文件中自动补全了代码。那么补全了什么代码?实现了什么功能? MapStruct的产生&…...
35天学习小结
距离上次纪念日,已经过去了35天咯 算算也有5周了,在这一个月里,收获的也挺多,在这个过程中认识的大佬也是越来越多了hh 学到的东西,其实也没有很多,这个暑假多多少少还是有遗憾的~ 第一周 学习了一些有…...
【iOS】UIViewController的生命周期
UIViewController的生命周期 文章目录 UIViewController的生命周期前言UIViewController的一个结构UIViewController的函数的执行顺序运行代码viewWillAppear && viewDidAppear多个视图控制器跳转时的生命周期pushpresent 小结 前言 之前对于有关于UIViewControlller的…...
ELK在Linux服务器下使用docker快速部署(超详细)
ELK是什么? 首先说说什么是ELK ELK 是一个开源的日志管理和分析平台,由三个主要组件组成: Elasticsearch:一个分布式搜索和分析引擎,能够快速存储、搜索和分析大量数据。它是 ELK 堆栈的核心,负责数据的…...
unity导入半透明webm + AE合成半透明视频
有些webm的文件导入unity后无法正常播报,踩坑好久才知道需要webm中的:VP8 标准 现在手上有几条mp4双通道的视频,当然unity中有插件是可以支持这种视频的,为了省事和代码洁癖,毅然决然要webm走到黑。 mp4导入AE合成半透…...
力扣: 四数相加II
文章目录 需求代码结尾 需求 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入…...
径向基函数神经网络RBFNN案例实操
简介 (来自ChatGPT的介绍,如有更正建议请指出) 径向基函数神经网络(Radial Basis Function Neural Network, RBFNN)是一种特殊的前馈神经网络,其结构和特点与其他常见的神经网络有所不同,主要表现在以下几个方面: 网络结构三层结构:RBF神经网络通常由三层组成:输入层…...
Java-数据结构-二叉树-习题(一) (✪ω✪)
文本目录: ❄️一、习题一(检查两颗树是否相同): ▶ 思路: ▶ 代码: ❄️二、习题二(另一棵树的子树): ▶ 思路: ▶ 代码: ❄️三、习题三(翻转二叉树): ▶ 思路: ▶ 代…...
js 时间戳转日期格式
timestampToDate(obj.project_time), import moment from “moment”; const timestampToDate (timestamp: any) > { const date new Date(timestamp * 1000); const newDate moment(date).format(“YYYY-MM-DD”); return newDate; // 使用Intl.DateTimeFormat进行格式…...
基于人工智能的自动驾驶系统项目教学指南
自动驾驶系统是人工智能的一个核心应用领域,涉及多个学科的交叉:从计算机视觉、深度学习、传感器融合到控制系统,自动驾驶项目可以提供高度的挑战性和实践意义。在这篇文章中,我们将构建一个基于深度学习的自动驾驶系统的简化版本…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
