【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…...
片上网络NOC:可生成RTL源代码与UVM验证环境的实用学习资料
片上网络NOC,可生成RTL源代码,生成uvm验证环境,内含有丰富的文档,带有readme文档,有例子工程,操作简单,是学习工作的好资料最近折腾NoC项目的时候挖到一个宝藏工具包,名字先不透露&a…...
AI爱好者成长手册:从“会用”到“用好”主流大模型的进阶之路
许多AI爱好者在使用大模型一段时间后会陷入一个困惑:为什么别人能用AI写出惊艳的文案、完成复杂的分析,而自己却总是得到平庸的结果?答案往往不在于模型的选择,而在于使用方式。经过在RskAi(www.rsk.cn) 平…...
使用seo站点管理系统需要注意哪些事项
SEO站点管理系统的核心注意事项 在当今数字化时代,SEO站点管理系统(Site Management System for SEO)是网站运营和推广的关键工具。它不仅能帮助提升网站在搜索引擎中的排名,还能带来更多的流量和转化。要真正利用这一工具&#x…...
SEO_避开这些SEO误区,优化效果事半功倍
SEO误区:避开这些误区,优化效果事半功倍 在当今竞争激烈的互联网环境中,搜索引擎优化(SEO)成为了每一个网站主的必修课。不少人在SEO实践中却犯下了一些常见的误区,这些误区不仅没有提升网站的排名&#x…...
高数值孔径物镜焦斑分析
背景介绍在显微成像、激光加工、光存储与单分子探测等应用中,高数值孔径物镜承担着“把光压缩到极小空间”的关键任务。物镜聚焦后的焦斑尺寸、形状、能量分布以及偏振特性,直接决定系统的分辨率、加工精度和探测灵敏度。因此,如何准确分析高…...
【PyTorch 3.0静态图分布式训练黑盒揭秘】:从FX Graph到Triton Kernel调度的7个隐藏断点与性能衰减临界值
第一章:PyTorch 3.0静态图分布式训练面试综述随着大规模模型训练需求激增,PyTorch 3.0正式引入原生静态图编译(torch.compile)与分布式训练深度协同机制,显著提升多GPU/多节点场景下的吞吐与可复现性。该版本将 torch.…...
STM32duino多传感器库:X-NUCLEO-IKS01A2驱动详解
1. 项目概述STM32duino X-NUCLEO-IKS01A2 是一个面向 Arduino 兼容生态(特别是基于 STM32 的开发板,如 NUCLEO-F401RE、NUCLEO-F411RE、NUCLEO-L476RG 等)的硬件抽象库,专为驱动 STMicroelectronics 官方推出的 X-NUCLEO-IKS01A2 …...
请解释 Linux 操作系统中的进程与线程的区别,并举例说明它们各自的应用场景。
在 Linux 操作系统中,**进程(Process)和线程(Thread)**是程序执行的基本单位,但它们在资源管理、隔离性、通信方式和性能开销上有显著区别。一、核心概念对比特性进程 (Process)线程 (Thread)定义操作系统进…...
Multisim仿真避坑指南:振幅调制器设计时,如何搞定静态工作点和输出幅度?
Multisim仿真实战:振幅调制器设计的5个关键调试技巧 在电子工程课程设计中,振幅调制器是一个经典但充满挑战的项目。许多学生在Multisim仿真阶段就会遇到各种问题——静态工作点不稳定、输出波形失真、峰峰值不达标...这些问题往往让初学者感到挫败。本文…...
Spring AI 2025实战:从零构建企业级智能问答系统
1. 为什么企业需要智能问答系统? 想象一下这样的场景:新员工入职第一天,面对公司庞杂的知识库手足无措;客服部门每天重复回答相同的基础问题;技术团队在查找内部文档时浪费大量时间。这些都是我亲身经历过的痛点&#…...
