C++——类和对象(2)

news2024/11/26 14:34:59

作者:几冬雪来

时间:2023年4月25日

内容:C++类和对象讲解

目录

前言: 

1.this指针: 

2.默认成员函数: 

3.构造函数:

4.析构函数:

5.构造函数的问题: 

结尾: 


前言: 

在上一篇博客中我们补齐了一些C++入门时候的内容,并且在章节的最后引出了我们C++中一个重要的知识点——类和对象。在那里我们也对类和对象里面的一些内容进行了一个大致初步的说明,而今天我们将继续学习我们的类和对象板块的知识。 

1.this指针: 

在上一篇博客中,我们讲解到了,在结构体中的成员函数,这个函数其实是公共的,它在公共的代码区域,也就是访问函数的地址是相同的

这里我们可以看出来它们的地址是一样的,但是如果它们访问的地址是一样的话,那么是这么做到的打印的值是不一样的? 它并不是直接不一样的,在这里它有一个隐藏的——this指针,也就是在我们传参数的地方有一个隐藏的this指针

在这里我们的编译器就会对我们的代码进行暗箱处理,使它们的形参不同

而在这里因为它们进行的是暗箱处理的,所以我们在这里看到的只是上面的这种代码。那么这里就有人要问了,要是我们想看到它们的暗箱操作,可以写下面这种代码吗? 答案是:不可以

在编译器中我们规定,this指针不能在形参和实参显示传递,但是可以在函数的内部显示的使用。 

既然this是一个指针,那么我们能不能将其进行修改将其变为一个空指针呢?这种行为也是不行的,因为我们的this类型的原因。

因为const的存在,所以我们的this指针不能进行修改。 

那么在这里我们的this指针是存放在哪里的?这里的答案是,我们的this指针是存放在栈区的。虽然它是一个指针,但是在我们的代码中它实现的操作为我们形参的操作,因此在这里我们可以将我们的this指针作为形参,而参数存在在栈区中,所以this指针也在栈区中。 

在这里就是我们的一个this指针一个经典的题目。 

2.默认成员函数: 

记得在我们写顺序表或者单向链表的时候,在书写它们的时候在一开始我们就要对其进行初始化的操作,在return的时候又要进行释放的操作。 

但是,在书写的过程中,有的时候我们难免会忘记写这两个成员函数,以至于我们的代码出现了问题。

  

而为了解决这个问题,在C++中我们引入了默认成员函数。那么在这里什么是默认成员函数呢,我们来看看一张表。

在这里在我们日常运用中和需要了解到的默认成员函数为前4个默认成员函数。

3.构造函数:

从上面的图表来看,构造函数在我们的结构体中完成的是我们初始化的工作。那么什么是构造函数呢? 首先这里的构造函数是我们一种特殊的成员函数,我们不能将它和以前的成员函数混为一谈。

构造函数虽然名为构造,但是它的主要作用并不是开空间创造对象,而且初始化对象。那么在这里说我们的构造函数是特殊的成员函数,它特殊在哪里呢?

那么在这里我们的构造函数是怎么样书写的?  

并且我们通过一系列的试验也可以在这里论证我们的第三个特征,也就是编译器会帮我们自动调用。 

那么对应的构造函数的重载又是什么意思呢?因为在我们的构造函数中,我们具有很多种初始化的方式,所以在这里就需要我们的函数重载来实现这个操作。   

  

在这里就是我们的构造函数的全过程了。 

4.析构函数:

讲解完了构造函数,那么接下来我们就要讲解我们的析构函数了,析构函数的定位和我们的构造函数相反,它主要负责的是清理工作。 并且析构函数会在对象销毁的时候自动调用

同样的我们的析构函数也是特殊的成员函数,也有它的特征: 

 

那么下来既然有了构造函数的代码经验我们也就直接将代码进行书写。

在这里我们和构造结构体一样,一开始要调用我们的类名,并且在类之前加入~符号。 在对象的生命周期结束的时候我们会自动的调用它们

5.构造函数的问题: 

在讲解完了我们的构造函数和析构函数之后,在这里我们提出一个存在于构造函数中的问题。 

这里有没有构造函数?答案是:有的。我们的编译器规定,如果类中没有显示定义的构造函数,C++编译器会自动生成一个无参的默认构造函数

但是在这里我们运行起来就会发现一个点。 

 

在这里虽然生成了无参的默认构造函数,但是它却是一堆随机值。那么在这里我们的C++编译器难道什么都没有做吗?其实并不是的。这里就要牵扯出我们C++中里面的一些规定了。

在这里我们将我们的类型分为内置类型和自定义类型。类似上面那种情况在不写的情况下,编译器会生成构造函数,类似整形这种,它并不会进行处理,所以在输出我们就会看到一堆随机值。但是如果是自定义函数的话,它就会去调用它的默认构造,在这里就会对其进行处理

只不过这种方式并不是在哪种编译器都会实现,有些编译器不进行处理,有些编译器会对其进行处理,但是这是一种个性化行为

那么在什么情况下可以让我们的编译器自动生成呢?

根据上面的一系列的操作,我们总结出来了一个结论。 

1.一般情况下,有内置类型成员的话,就需要我们自己写构造函数,不能由编译器自动构成。

2.全部是自定义类型成员可以考虑让编译器自己生成。

而在C++11中我们给予了一个补丁,那就是在构造函数的那里我们可以给缺省值

同样的我们的构造函数的调用根普通函数的调用也不一样。 

如果在main函数中,我们的d1如上面这样进行无参调用的时候也会出现一点问题。 

根据我们以前学习的知识可以确认,这两个函数可以同时存在,因为一个参数为空,一个有参数所以在这里它们两个函数可以构成函数重载,但是在进行无参调用的时候,我们的调用无法确定要调用哪一个。所以在写函数的时候,两个函数我们只选其中的一种,而一般我们就选择下面的那一种方式,也就是全缺省。 

同时我们在有些特定类中也可以由编译器来为我们自动创建析构函数。 

结尾: 

很快的我们的C++的一个小板块就要学习结束了,相信学习到了这里,大家隐隐约约可以感觉到我们的难度在上升了吧,但是在我们将C++初步掌握好了之后,那之后学习C++就不会觉得那么难了(大概)。最后希望这篇博客能为各位带来帮助。

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

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

相关文章

Transformer 代码详细解析

Transformer 代码详细解析 文章目录 Transformer 代码详细解析一、Transformer 背景介绍1.1 Transformer 的诞生1.2 Transformer 的优势1.3 Transformer 的市场 二、Transformer架构解析2.1 认识 Transformer 架构2.1.1 Transformer模型的作用2.1.2 Transformer 总体架构图 2.2…

全国计算机等级三级网络技术试卷详解(一)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1.下列关于RPR技术的描述中,错误的是()。 A) RPR与FDDI一样使用双环结构 B) 在RPR环中,源节点向目的节点成功发出…

2023常用的10款电力电子系统仿真分析软件推荐

市场上有许多电子仿真器,那么对于电力电子项目来说,哪种仿真器最好呢?或者因为期望任何软件包在各个方面都是最好的是不合理的,那么用户如何确定哪个软件是项目的最佳选择? PSIM PSIM是一种模块化封装,专为…

华为认证实验篇-ENSP的安装(附下载地址)

ENSP(Enterprise Network Simulation Platform)是华为公司开发的一款网络仿真软件,它可以帮助网络工程师进行网络拓扑设计、网络配置、网络测试等工作。本篇文章将介绍如何在Windows操作系统上安装ENSP。后续会在专栏陆续更新ENSP的实验&…

MACH SYSTEMS操作手册 SAEJ2716(SENT) to RS-232/CAN Gateway怎么使用?

双通道SAE J2716 (SENT)至RS-232/CAN总线网关,具有两个双向SENT通道和RS-232 (SENT-RS232) 或CAN总线 (SENT-CAN) 接口。两种变体还提供两个模拟输出,可以直接将输入SENT数据转换为模拟电压。该网关配备了一个免费的PC应用程序,用于SENT通信分…

VS同时调试主程序和子程序工具

VS要想要实现同时调试主程序和子程序,可使用工具 Microsoft Child Process Debugging power Tool 来实现。 我的环境和官方使用说明 环境:VS2019 官方使用说明:Introducing the Child Process Debugging Power Tool - Azure DevOps Blogh…

Swagger 版本控制 注释展示(.NET)

版本控制 项目创建 以Visual Studio 2022为例&#xff0c;创建Web API项目&#xff0c;如下图所示。 在创建时勾选启用OpenAPI支持&#xff0c;默认安装Swashbuckle.AspNetCore库&#xff0c;并配置相关信息。 创建版本枚举类 /// <summary>/// 版本枚举/// </su…

新版Fluent默认保存的h5文件无法用Tecplot打开的解决办法(亲试有效,评论区是重点)

文章目录 Ansys Fluent简介Fluent 输入/出 文件格式新版Fluent的输出压缩文件&#xff08;.cas.h5文件&#xff09;解决办法 Ansys Fluent简介 Ansys Fluent &#xff0c;是国际上比较流行的商用CFD软件包&#xff0c;在美国的市场占有率为60%&#xff0c;凡是和流体、热传递和…

IP地址的分配

一、ip地址的作用 用IP地址来标识Internet的主机&#xff1b;IP协议可以根据路由选择协议提供的路由信息对IP数据报进行转发&#xff0c;直至抵达目的主机。IP地址和MAC地址的匹配&#xff1b;数据链路层使用MAC地址来发送数据帧&#xff0c;因此在实际发送IP报文时&#xff0…

分布式消息队列Kafka(四)- 消费者

1.Kafka消费方式 2.Kafka消费者工作流程 &#xff08;1&#xff09;总体工作流程 &#xff08;2&#xff09;消费者组工作流程 3.消费者API &#xff08;1&#xff09;单个消费者消费 实现代码 package com.zrclass.kafka.consumer; import org.apache.kafka.clients.consum…

【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 前几天瑶瑶子…

0Ω电阻在PCB板中的5大常见作用

在PCB板中&#xff0c;时常见到一些阻值为0Ω的电阻。我们都知道&#xff0c;在电路中&#xff0c;电阻的作用是阻碍电流&#xff0c;而0Ω电阻显然失去了这个作用。那它存在于PCB板中的原因是什么呢&#xff1f;今天我们一探究竟。 1、充当跳线 在电路中&#xff0c;0Ω电阻…

CCF-CSP 2013-12-3 最大的矩形(暴力枚举)

首先我们可以先根据数据范围反推时间复杂度&#xff0c;比如&#xff0c;数据范围n < 1000,我们可以将时间复杂度控制在O(n), O(n)logn 思路上比较容易想到的是枚举所有情况&#xff0c;然后输出面积最大的情况即可 可以在第一重循环枚举i&#xff0c;表示从第i个矩形开始往…

云HIS系统源码,部署云端,支持多租户,实现医疗数据共享与交换

云HIS系统源码&#xff0c;医院信息管理系统源码。采用云端SaaS服务的方式提供&#xff0c;采用前后端分离架构&#xff0c;前端由Angular语言、JavaScript开发&#xff1b;后端使用Java语言开发。 文末获取联系&#xff01; 基于云计算技术的B/S架构的云HIS系统&#xff0c;采…

zynqmp 外接fpga linux内核驱动修改

325t配置: 使用内核自带的linux-xlnx-xilinx-v2021.2/drivers/fpga/xilinx-spi驱动&#xff0c;做serial slave模式&#xff0c;设备树更改如下(根据 linux-xlnx-xilinx-v2021.2/Documentation/devicetree/bindings/fpga/xilinx-slave-serial.txt,修改)slave-serial需要将fpga的…

【Java实战篇】Day13.在线教育网课平台--生成支付二维码与完成支付

文章目录 一、需求&#xff1a;生成支付二维码1、需求分析2、表设计3、接口定义4、接口实现5、完善controller 二、需求&#xff1a;查询支付结果1、需求分析2、表设计与模型类3、接口定义4、接口实现步骤一&#xff1a;查询支付结果步骤二&#xff1a;保存支付结果&#xff08…

控制工程有哪些SCI期刊推荐? - 易智编译EaseEditing

控制工程是一门涵盖广泛的学科&#xff0c;其研究内容涉及控制理论、控制工程应用、自动化技术等多个方面&#xff0c;因此相关的SCI期刊也比较多。以下是一些推荐的控制工程SCI期刊&#xff1a; IEEE Transactions on Automatic Control&#xff1a; 该期刊是自动控制领域顶…

【springcloud微微服务】分布式事务框架Seata使用详解

目录 一、前言 二、事务简介 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性 三、分布式事务场景 3.1 分布式事务起源 3.2 分布式事务典型场景 3.2.1 跨库事务 3.2.2 分库分表 3.2.3 服务化 四、分布式事务常用解决方案 4.1 分布式事务理论基础 4.1.1 2PC两阶段提…

降低风险和最大化成功:如何解决项目管理中的成本差异

作为项目经理&#xff0c;你知道让项目按计划进行并按预算进行对于项目管理的成功至关重要。你可以使用的关键工具之一是成本差异分析。但成本差异到底是什么&#xff0c;如何利用它来发挥优势呢&#xff1f; 定义成本差异 成本差异是项目实际成本与预算或计划成本之间的差异…

Linux shell命令行基础

shell简介 shell 与内核沟通的界面、应用程序等。用于将用户操作传递给内核执行。 shell是面向过程 的若类型的解释性语言&#xff0c;不需要编译即可直接执行&#xff0c;常用于作脚本 Linux中的shell 在/etc/shells文件中 存储Linux包含的shell。 最常用的是bash&#xff0c;…