C++——类和对象

news2024/11/14 23:42:54

作者:几冬雪来 

时间:2023年4月21日

内容:C++类和对象

目录

前言: 

1.inline函数:

2.auto(补充): 

3.类: 

4.类的访问限定符及封装: 

5.封装:

6.类域: 

7.类的实例化: 

结尾: 


前言: 

在上一篇博客中我们对C++中的引用的知识做了拓展的讲解,同时也引入了新的内容——常引用和auto,并且也对它们进行了一个大致的说明讲解。今天我们将开展C++知识的一个新的知识的讲解,并且这节课也可以是我们C++中非常重要的一节课。

1.inline函数:

在我们日常写代码的时候,调用函数是我们必不可少的一个操作,那么在调用函数的过程中就难免会产生消耗,而栈帧就是我们调用函数中最大的消耗。 

类似我们下面的这个代码:

在这里我们的Add要被调用10000次,所以在这里我们就需要建立10000个栈帧,这在我们看来就是非常浪费的一种行为。 

C语言中我们使用宏的方式去解决这个问题。但是宏在这里有一些缺点所在,在介绍C++的时候我们有说过在这个板块我们需要的是用C++的知识去填补C语言的坑,那么这种情况我们该怎么用C++去书写呢?

C++中如果我们要解决这个问题的话就要了解到一个新的词语——inline函数。

但是在这里,inline函数并不是可以作用于全部函数之上的,它的应用有条件的限制。 

首先,我们的inline函数适用的是短小的频繁调用的函数。如果太长可能会导致这里我们的代码膨胀。 

那么有人就要问了,在这里我们是不是要先去判断其长短后,再考虑要不要去使用inline呢?其实这里不用想那么多。因为在这里,我们的编译器会帮助我们把关inline对于编译器仅仅只是一个建议,最终决定是否使用成为inline,由编译器决定

那么在上面情况下我们的inline会被否决掉呢?我们将例子举出来:

1.比较长的函数。

2.递归函数。

3.默认debug的模式下,inline不会起作用,否则不方便调试。

同时这里要知道,我们的inline函数的声明和定义不能分离。inline不会进符号表,分离可能导致链接出问题。

2.auto(补充): 

在上一篇博客中我们讲解了auto的内容,今天我们将对其进行一个知识的补充。 

首先我们的auto在同一行内不能这样使用,类似前面一个整形类型,后面一个浮点型。 

其次,我们的auto也不能用来定义数组的类型。 

最后,在这里我们的auto不能用来作为函数的参数。 

还有就是这里auto在空指针这里会出现一个坑

这里左边这里,第二个函数引用即使为空,它并不会去调用第二个函数,而是去调用第一个函数。只有像我们第一个代码引用了——nullptr,它才可以成功去调用第二个函数。 

3.类: 

从这里开始,我们就开始进入类和对象的学习了,那么在这里什么是类呢,这里我们写一个代码出来。

在这里我们的C++兼容C语言,struct以前的用法依旧可以使用,同时在这里我们的struct升级成为了类

同样的我们的struct升级成为了类,那么在这里我们的结构体的成员也会发生改变,原本在结构体中我们只能定义成员变量,而在这里我们可以定义成员函数。 

这里就是我们的写法,同时在这里我们的调用也是十分的简单。在结构体定义,C++中我们更经常

用class来代替struct。 但是在这里如果使用class的话就牵扯出来了一个权限的问题

4.类的访问限定符及封装: 

C++我们定义了3种访问限定符。 

同样的这里也有我们访问限定符的一系列的说明

那么在这里我们的公有和私有是什么意思?用现实世界的例子举例,比如我们的个人信息中的身份证号码,家庭住址等不想让别人知道的,这里就对应着私有。像性别,年龄,性命等可以让别人知道的在这里就指的是公有。代码中也是如此,不想让别人使用的这里我们就定义为私有,可以别人返回和使用的我们就定义为公有

这里就是我们公有和私有内容的范围,类似我们的这个图从public开始到我们写一个访问限定符之间的内容就都是公有的,直到遇到我们的访问限定符private后接下来的内容变为私有,因为后面没有访问限定符,所以到函数结束的位置其余的内容都为私有。 

同时的,在这里我们的class和struct都可以作为类,访问限定符也都适用于类,所以它们之间可以进行替换唯一不同的是在这里我们的class默认内容为私有,struct默认内容为公有

在这里我们也要注意一个点,那就是在我们的类中,声明和定义是可以进行分离的。只不过这里在定义的时候,我们需要在Init函数的前面加入一个::操作符来指向。 

第二个要了解的点是:在类里面直接定义的函数默认就是inline

5.封装:

在我们的面向对象中有三大特性:封装,继承,多态。而在这里我们将对面向对象中的封装进行讲解。 

那么什么是封装呢?封装说的是:将数据和操作数据的方式进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

对于我们的代码来说,封装是一种更好的管理,它可以杜绝一些我们坏的行为

这里就是我们封装的作用和实现。 

6.类域: 

在这里我们接下来就要介绍一下类域了。 

我们当初介绍域的时候有说过,平常我们写代码的时候,一般都是先访问局部域,再访问全局域。如果我们的命名空间域没有特别指向或者展开的话,域中的量我们不会访问

但是类似我们的函数定义和声明那里的话,我们是先访问局部域,再访问类域,最后访问全局域

7.类的实例化: 

这里类的实例化指的是用类类型创建对象的过程,我们称为类的实例化。

在我们的类中不能存储数据。只有类进行了实例化之后我们才可以向其中存储数据。

在这里我们的第一种方式是访问的top,而top在声明中,所以这里我们并不能给声明的内容数据。而在第二段代码中的话,就是开辟了一块空间,在这里我们就可以给数据。 

进行了我们来计算它们的大小。

以前我们的结构体中只有结构体成员,而现在在结构体中还多出了成员函数,那么在这里我们的st1的大小是多少呢

在这里我们算出st1的大小是12,那么这是为什么呢?因为在这里我们只算成员的变量不算成员的变量,不算成员的函数,对象中只存储了成员变量,没有存成员函数。

 

在这里我们的st1和st2调用的不是同一个函数。但是这里我们访问Init的代码,它们调用的是同一块地址,也是同一个函数。这就是我们说的对象中只存储了成员变量,没有存成员函数的原因,在这里我们也可以为st1和st2中都定义上Init,但是这样做太过于浪费,因此我们一般将其放在公共区域,要调用的话也直接去公共区域调用就行了。 

结尾: 

在这里,我们就开始进入我们C++的重点内容开始学习了,接下来我们所学习的内容将会一次比一次要难,要掌握C++我们还是任重道远。最后希望这篇博客可以为各位带来一些帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始下载torch+cu(无痛版)

从零开始下载torchcu(无痛版) 文章目录 从零开始下载torchcu(无痛版)一,前言二,配置torch的GPU版具体步骤1,查看电脑安装的Cuda版本2,在pytoch官网检索待下载whl包名以及版本3,下载指…

playwright实战篇(tx、ali225)

人人都笑金角,人人都是金角推荐文章: 1、https://playwright.dev/python/docs/api/class-playwright //官方文档 2、https://cuiqingcai.com/36045.html //崔庆才教程 3、https://github.com/qqq732004709/ //实战参考 4、https://www.cnblogs.com/ca…

asp.net mvc网上书店购物系统(带项目文档)

c#_asp.net mvc网上书店购物系统(带项目文档) mvc网上书店购物系统 主要技术: 基于asp.net mvc架构和sql server数据库,并采用EF实体模型开发。 功能模块: 系统包括前台和后台两个部分,用户可在前台浏览…

KL散度和交叉熵的对比介绍

KL散度(Kullback-Leibler Divergence)和交叉熵(Cross Entropy)是在机器学习中广泛使用的概念。这两者都用于比较两个概率分布之间的相似性,但在一些方面,它们也有所不同。本文将对KL散度和交叉熵的详细解释…

学系统集成项目管理工程师(中项)系列03_职业道德规范

1. 职业道德 1.1. 涵盖了从业人员与服务对象、职业与职工、职业与职业之间的关系 1.2. 是所有从业人员在职业活动中应该遵循的行为准则 1.3. 包括爱岗敬业、诚实守信、办事公道、服务群众和奉献社会 2. 道德 2.1. 通常与法律相对应,具有非强制性 2.2. 指人们依…

《花雕学AI》26:多维度了解ChatGPT思维链提示的原理、方法、使用和发展的22个问题

早上5点起床,没有去打羽毛球,打开电脑,漫无边际的浏览,偶然发现了一个提法:ChatGPT思维链提示。于是,我使用与ChatGPT同源技术的新Bing引擎(GPT-4),来进行搜索与了解相关…

基于在线优化的快速模型预测控制仿真Fast_MPC(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 ​模型预测控制(Model Predictive Control,MPC)是一种基于在线计算的控制优化算法,能够统一处理带约束的多参数优化控制问题。…

ESP8266 最简单的OTA升级模式

最近在做一个项目时有OTA的需求,之前是通过arduino自带的ota模式,虽说也可以用,但操作比较麻烦,昨晚在网上搜索相关教程,发现了使用巴法云来实现ota的功能,现分享如下 1、首先要让你的设备联网 2、注册巴法…

jsp基础语法

前提 安装jdk参考 下载tomcat解压&#xff0c;运行tomcat不报错即可 第一个jsp程序 切换到webapps下ROOT文件夹下&#xff0c;将除了WEB-INF文件外的全部内容删除&#xff0c;新建index.jsp index.jsp内容如下 <!DOCTYPE html> <html lang"zh-CN"&g…

React Proxy 详细流程与配置方式(webpack、setupProxy.js、package.json)

一、 package.json 配置方式 全部以 GET 请求为例&#xff0c;每次修改配置后&#xff0c;重启项目&#xff0c;否则不生效。 访问 http://127.0.0.1:6000/api/user/list 接口为例检查自己脚手架版本 $ create-react-app -V若脚手架版本在 2.0 以下&#xff0c;可以使用对象类型…

【C++】deque的实现原理简单介绍

前言 deque被称为双端队列&#xff0c;它的出现主要是为了结合vector和list的优点并减小它们的缺点&#xff0c;实际上deque确实结合了vector和list的优点减小了它们的缺点&#xff0c;但是它的结合也让它自己的优点没有原始的vector和list那么极致&#xff0c;导致deque变得很…

C++好难(1):C++的入门

目录 前言&#xff1a; C的历史&#xff1a; c的领域 1.C的关键字&#xff1a; 2.命名空间 2.1命名空间的定义&#xff1a; 1&#xff09;命名空间的普通定义&#xff1a; 2&#xff09;命名空间的嵌套定义&#xff1a; 3&#xff09;命名空间相同的处理&#xff1a; …

没有公网IP,自建网站如何让外网访问?

受创业潮影响&#xff0c;身边很多朋友都自己开公司创业了&#xff0c;作为一个IT行业从业者&#xff0c;我就莫名的开始忙起来了&#xff0c;因为掌握编程技术&#xff0c;朋友们经常找到我&#xff0c;让我帮他们做公司网站。但是存在一个无法回避的问题&#xff0c;就是我的…

0/1背包问题——从LeetCode题海中总结常见套路

目录 问题讨论 01背包问题公式 为什么状态压缩到一维时候需要逆序&#xff1f; 怎样求次数&#xff1f; 转化成最大和sum/2的01背包&#xff1a;LeetCode.416.分割等和子集 转化成最大和sum/2的01背包&#xff1a;LeetCode1049.最后一块石头的重量II LeetCode.494.目标和…

微软文字转语音不能试用了,分享三个方法给大家!

最近很多小伙伴告诉我&#xff0c;微软文字转语音不能在线试用了&#xff0c;这是因为微软关闭了官方的使用页面&#xff0c;所以现在不能直接使用微软的网页版进行文字转语音了。 那么我们还有没有更好的方法去“白嫖”微软的文字转语音呢&#xff1f; 答案是肯定的&#xf…

初识NoSQL(一文读懂)

最近参加了Oracle的数据库培训&#xff0c;对NoSQL非常好奇&#xff0c;总结一下关于NoSQL的认识。 NoSQL是Not Only SQL&#xff0c;并不是去除掉SQL&#xff0c;泛指非关系型的数据库。关系&#xff0c;指关系模型&#xff0c;具体指同一个对象在不同属性上的值 以及 不同对…

一个AK/SK泄露检测的实现思路

01、简介 在企业上云的过程中&#xff0c;AK/SK泄露导致的数据泄露事件屡见不鲜。在企业混合云架构下&#xff0c;公有云和私有云都存在大量的AccessKey&#xff0c;如何有效地检测可能的AK/SK泄露事件&#xff0c;一直困扰着企业的安全人员。 本文提供了一种比较容易实现的思路…

UART协议学习——异步全双工串行通信方式

文章目录 前言一、简介1、优点2、缺点 二、数据格式三、波特率1、定义2、波特率和采样频率 四、常见接口电平1、TTL电平2、RS232&#xff08;负逻辑&#xff09;3、RS485 前言 2023.4.22 世界地球日 一、简介 UART&#xff1a;Universal Asynchronous Receiver/Transmitter&a…

Albert-Z-Guo/Deep-Reinforcement-Stock-Trading

深加固股票交易 该项目打算在投资组合管理中利用深度强化学习。框架结构的灵感来自Q-Trader。代理人的奖励是在每个行动步骤评估的未实现净利润&#xff08;意味着股票仍在投资组合中且尚未兑现&#xff09;。对于每一步的不作为&#xff0c;投资组合中都会增加负惩罚&#xf…

USMART 函数错误解决方法

身为电子工程师&#xff0c;看了马斯克的星舰飞船&#xff0c;真是太帅了&#xff1b; 深知一个良好的测试环境对产品性能的影响&#xff0c;对工作效率的提升。 小资源MCU调试代码的工具USMART 使用起来。 移植的文章网上有很多&#xff0c;但是对移植过程中使用错误的文章…