【C++笔记】C++之类与对象(上)
【C++笔记】C++之类与对象(上)
- 1、类是结构体的升级
- 2、类中可以定义的东西
- 3、类访问限定符
- 4、类的声明
- 5、类的实例化(定义)
- 6、类的大小的计算
- 7、this指针
1、类是结构体的升级
C++的一个显著特征就是兼容C语言,所以C++把结构体“升级”成了“类”,之所以是“升级”是因为,在C++中的结构体及支持以前C语言的结构体的玩法,也可以支持C++中类的玩法。
例如单链表节点这个类,我们既可以写成纯C版本:

用纯C的写法,我们每次要定义一个节点变量的时候,都必须要加上一个前缀struct,非常的麻烦。
而且就算是我们用了typedef,在结构体内部也还是不能直接用typedef后的符号,因为在结构体内部typedef还没有起作用:

非常麻烦!
但在C++中,我们就不必要担心这些情况,因为在C++中,结构体也被当成了类,而类是直接可以类名来定义变量的:

不管类内部还是外部,我们都可以直接使用类名来定义变量。
2、类中可以定义的东西
既然类是结构体的“升级”,那么内在结构体中定义的东西也一定能在类中定义,所以类中能定义的包括:
各种变量:

数组:

还有枚举和结构体等等:

几乎可以定义所有的东西:
但C++的类除了可以定义以上这些东西之外,还一个定义一个类独有的东西:“成员函数”,
有了成员函数,我们在管理结构体中的各个成员的时候就可以更方便,而不需要每写一个函数就需要传参。
例如栈这个类的初始化:

这是因为类划分了一个“类域”,在成员函数被调用的时候,就回到类中去寻找各个变量,这就不需要我们老是传递参数了。
而且使用起来也很简单,就像以前结构体访问成员变量一样:

而这个“public”是一个类访问限定符。
3、类访问限定符
在一个类中,我们总有些东西是不想被外面访问到的,也总有一些东西是想要对外开放的,这时候就需要访问限定符来管理了。
访问限定符一共有三个:
public(公有)
protected(保护)
private(私有)
第一个public表示公开,由这个访问限定符修饰的成员不管是在类内部还是外部,都可以自由访问:

而第二个protected,我们现在暂且认为它和public是一样的,因为这个访问限定符实在以后的类的继承中才能显现出区别的。
第三个private表示私有,被这个访问限定符所修饰的成员就只能在类里边访问,而在类外边是访问不到的:

而要是我们不显示的添加访问限定符,在类和结构体中也是有默认的访问限定符的。
其中,类的默认访问限定符是private:

而结构体的默认访问限定符是public:

4、类的声明
大家是否有过一个疑问?就是我们平时写的这样一个类:

它到底是声明还是定义呢?
首先我们要明确声明和定义的区别,声明只是告诉编译器,有这么一个函数或变量存在,而定义则是为这个函数或变量开辟空间。
所以我们就可以想接下来这样来验证上面所写的到底是声明还是定义:

我们发现用域作用限定符是访问不到成员的,这就说明编译器并没有为这个类开辟空间。所以编译器找不到这个成员的地址。
5、类的实例化(定义)
有声明就得有定义,其实我们平时创建的一个类对象就是一个类的定义,也称为类的实例化:

这样,编译器才会真正开辟空间。
6、类的大小的计算
其实类的大小计算遵循着结构体内存对齐的规则,例如下面这两个类和结构体:

从结果就可以看出类大小的计算也是遵循着结构体内存对齐的那套规则的。
同时不管我们是使用类名来计算的小还是使用类对象来计算大小,都是可以准确算出一个类的大小的:

这是因为就算我们没有实例化类对象,但通过类名我们还是可以找到类的声明,类的生命虽然没有开辟空间,但也相当有了一张“图纸”,我们可以通过这张“图纸”来计算出类的大小。
但是有一点是不一样的,就是当类中存在成员函数的时候:

我们发现,就算类中添加了成员函数,类的大小还是没有发生改变,这是为什么呢?
其实这是一种节约资源的做法,我们不妨先想一想,我们平时定义的各个类对象,他们的成员变量是否是相同的变量?

答案显然不是的。
但它们所调用的函数是不是同一个呢?
答案是是的,因为函数的逻辑都是一样的,而各个对象的成员变量的值是可能各不相同的,不相同的只当然不能共用同一个变量了,但是相同的逻辑就只需要一段相同的指令就行了。
所以,类中就没有必要存储成员函数了。类中的成员函数其实是放在代码段中的。
但要是,我有一个“空类”,也就是类中没有成员变量也没有成员函数,那这个类的大小又该是多少呢?
我们可以来验证一下:

我们可以看到,空类的大小是1字节。
其实这一字节的作用只是用来占位而已,只是表示这个类存在过。
7、this指针
经过前面的叙述,我们已经知道成员函数并不存储在类中。那么问题来了,既然不存储在类中,那么在调用的时候就必定需要传参啊,那为什么在写成员函数的时候不需要传递成员变量呢?
其实,所谓的“不用传参”只是表面现象而已,其实只是把传递对象的工作交给了编译器来做而已。
事实上,我们平时写的成员函数还有一个隐藏的参数:“this”指针,这个指针是一个类对象的指针,也就是调用函数的对象的指针:
例如下面这个函数,编译器会在底层将它处理成这样的一个函数:

但这是规定给编译器做的工作,也就是说我们不能和编译器“抢工作”,不能显示的将this指针,写在参数列表中。
但我们却可以在类当中使用它,例如上面的这个函数也可以这样写:

但是像这种单纯访问成员变量的情况,我们一般都不会显示的将this写出来,因为编译器自己会自动补上,何必自己给自己找麻烦呢?
相关文章:
【C++笔记】C++之类与对象(上)
【C笔记】C之类与对象(上) 1、类是结构体的升级2、类中可以定义的东西3、类访问限定符4、类的声明5、类的实例化(定义)6、类的大小的计算7、this指针 1、类是结构体的升级 C的一个显著特征就是兼容C语言,所以C把结构体“升级”成了“类”&am…...
ebay灯串UL报告 UL588检测标准
季节性和装饰性照明用品即灯串以及配件都是便携式插头连接的临时性商品,最大额定输入电压为 120 伏。 由 ILAC ISO 17025 认证的实验室出具的检测报告,确认每件商品均已经过检测,符合下列要求: 季节性和装饰性照明用品(灯串&…...
TCP/IP协议追层分析物理层(第三十九课)
TCP/IP协议追层分析物理层(第三十九课) 1 物理层:建立、维护、断开物理连接,定义了接口及介质,实现了比特流的传输。 1、传输介质分类 有线介质:网线(双绞线)、光纤 无线介质:无线电 微波 激光 红外线 2、双绞线分类: 五类cat5: 适用于100Mbps 超五类cat5e:适用于…...
Kotlin优点及为什么使用Kotlin
文章目录 一 Hello Kotlin二 Kotlin优点三 团队为什么采用 Kotlin 一 Hello Kotlin Kotlin和Andriod 二 Kotlin优点 三 团队为什么采用 Kotlin...
ES 概念
es 概念 Elasticsearch是分布式实时搜索、实时分析、实时存储引擎,简称(ES)成立于2012年,是一家来自荷兰的、开源的大数据搜索、分析服务提供商,为企业提供实时搜索、数据分析服务,支持PB级的大数据。 -- …...
Fairy下载和使用
写在最前:本系列中将会涉及到 Unity,C#,Lua和FairyGUI(FGUI)。 FairyGUI介绍 官网: FairyGUI 编辑器下载: FairyGUI 截至文档记录最新版: https://res.fairygui.com/FairyGUI-Ed…...
隧道HTTP优化程序示例
作为专业爬虫程序员,我们经常需要使用代理服务器处理大量的请求。但是,单一服务器往往无法承担高并发请求和HTTPS加密的压力,这时候我们可以利用CDN来优化性能,并实现反向代理和HTTPS加速。下面,让我们一步步来了解。 …...
Flink源码之State创建流程
StreamOperatorStateHandler 在StreamTask启动初始化时通过StreamTaskStateInitializerImpl::streamOperatorStateContext会为每个StreamOperator 创建keyedStatedBackend和operatorStateBackend,在AbstractStreamOperator中有个StreamOperatorStateHandler成员变量…...
selenium常见等待机制及其特点和使用方法
目录 1、强制等待 2、隐式等待 3、显示等待 1、强制等待 强制等待是在程序中直接调用Thread.sleep(timeout) ,来完成的,该用法的优点是使用起来方便,语法也比较简单,缺点就是需要强制等待固定的时间,可能会造成测试的时间过…...
C++物件数组的常用方法介绍
以下代码建立了一个物件数组Student,并展示了如何计算物件数组的长度,如何从物件数组中找到特定的对象,如何根据数组的不同参数进行排序,以及如何找到最大和最小值。 #include <iostream> #include <algorithm>using…...
云计算:新一代的技术革命
云计算,作为21世纪的一项重要技术革命,已在全球范围内引发了深远的影响。它改变了我们存储和处理数据的方式,使得企业无需再建设和维护昂贵的本地服务器和数据中心。本文将深入探讨云计算的基本概念,类型,主要优点&…...
数据结构—图的应用
6.4图的应用 概念回顾—生成树 生成树:所有顶点均由边连接在一起,但不存在回路的图。 一个图可以有许多棵不同的生成树、含有n个顶点 n-1 条边的图不一定是生成树所有生成树具有以下共同特点 生成树的顶点个数与图的顶点个数相同;生成树是图的…...
Unity 鼠标控制 UI 放大、缩小、拖拽
文章目录 1. 代码2. 测试场景 1. 代码 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;public class UIDragZoom : MonoBehaviour, IDragHandler, IScrollHandler {private Vector2 originalSize;private Vector2 originalPosition;private RectTr…...
tensorflow 模型计算中,预测错误;权重参数加载
tensorflow 模型计算中,预测错误;权重参数加载 tensorflow 模型计算主要代码(正确代码) linear1_kernel_initializer tf.constant_initializer(numpy.transpose(data["linear1.weight"])) linear1_bias_initializer …...
Jay17 2023.8.14日报 即 留校集训阶段性总结
8.14 打了moeCTF,还剩一题ak Web。 Jay17-集训结束阶段性总结: 集训产出: 自集训开始以来一个半月,最主要做的事情有三。 一是跟课程,复习学过的知识,学习新的知识;目前课程已大体听完&…...
【C语言】小游戏-扫雷(清屏+递归展开+标记)
大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2. 初始化棋盘(11*11) 3.打印棋盘(9*9) 4.布置雷 5.计算(x,y)周围8个坐标的和 6.排查雷 <1>清屏后打印棋盘 <2>递归展开 <3>标记雷 四、完整代…...
云服务 Ubuntu 20.04 版本 使用 Nginx 部署静态网页
所需操作: 1.安装Nginx 2.修改配置文件 3.测试、重启 Nginx 4.内部修改防火墙 5.配置解析 6.测试是否部署成功 1.安装Nginx // 未使用 root 账号 apt-get update // 更新apt-get install nginx // 安装 nginx 1.1.测试是否安装没问题 在网页上输入云服务的公网…...
无后效性
动态规划的概念 在上例的多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义…...
Kubernetes系列-删除deployment和pod
通过deployment创建的pod直接执行delete是不会正常被删除的,因为deployment中设置了pod的数量,deployment会动态维护pod的数量,倘若pod数量少于约定数量,deployment会创建pod,直到pod数量达到约定数量才会停止。 如若…...
kotlin字符串方法
以下是一些常用的 String 方法示例: 1.获取字符串长度: val str "Hello, Kotlin" val length str.length2.字符串比较: val str1 "apple" val str2 "banana" val compareResult str1.compareTo(str2)3…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
