C++的默认成员函数

news2024/12/29 10:47:20

上一次我们说到了C++的类,我们还知道在C++的类中可以写函数,而且这个函数也属于这个类,我们可以直接使用这个类的对象去调用这个函数。

今天我们来看一下C++的六个默认成员函数(这里说是6个,但是重要的只有4个)

构造函数

在C语言中,如果我们定义了一个对象,我们想初始化它,那么我们就需要自己写一个Init()函数,去初始化它,但是在我们的C++中,我们有一个函数叫做构造函数,它的功能就是初始化对象,在我们定义一个对象的时候它会自动调用对应的构造函数,来完成初始化。

下面我们来看一下

 我们现在看到,如果我们现在想初始化这个 Date类型的对象,我们需要手动的去调用这个类里面的Initial()函数,我们来看一下

 

我们来看一下是否可以完成初始化

 

我们看到,我们已经成功的初始化了,不过这个是C语言的方式,我们刚才说了,我们在C++中有默认的构造函数,但是什么是构造函数呢??

构造函数就是函数名和类名相同,且没有返回值,这就是构造函数,我们C++中如果没有写构造函数,那么编译器会给你自动生成一个,如果写了,那么编译器就不会自动生成,默认构造函数,就是不需要传参就可以调用的函数,就叫做默认构造函数,默认构造函数有三种,1. 编译器自动生成 2.自己写一个无参的构造函数,3.写一个全缺省的构造函数,这几个构造函数,都是可以不传参就可以调用的,所以称之为默认的构造函数,而构造函数在对象定义的时候会自动调用,所以我们不用担心创建对象的售后忘记调用初始化函数。

 

这个是我们自己写的一个默认的构造函数,我们看一下在创建对象的时候是否会调用它

 

 

我们看到确实自动调用了构造函数

那么我们刚开始说了,构造函数就是Init()函数,那么我们想知道如果我们自己不写构造函数,编译器自动生成的构造函数,会帮我们干什么呢?

 

我们看到,它里面的值是乱的,在我们现在看来就是什么都没有干,那么它真的就什么都没有干吗?

其实不是的,在我们的C++中我们有的类型大概可以分为两种,第一种是内置类型(C++里面本来就拥有的,例如:int double 指针等), 还有一种就是自定义类型(struct/class)定义的类型,我们就称之为是自定义类型,而而我们的编译器自动生成的构造函数,对于内置类型不处理,而我们的自定义类型,会调用它自己的构造函数,我们来看一下

我们现在有一个 stack的类,我们想定义一个myqueue,里面有两个stack的对象

那么我们来看一下,我们的这个myQueue的对象的编译器自动生成的默认构造函数 ,会不会有用呢??

 

我们看到,我们确实调用了两次stack的构造函数,那么我们的构造函数到底需不需要写呢??

我们在看一下默认构造函数可以干什么,我们想一下,默认构造函数,对内置类型不处理,对自定义类型会调用它自己的构造函数,所以,如果我们一个类中都是自定义类型的成员变量,那么我把就不需要写对应的构造函数,编译器自动生成的就可以了,但是却如果里面有我们的内置类型,并且我们需要对内置类型需要完成初始化,我们就需要自己实现构造函数。 

析构函数

在C语言中我们的变量销毁的时候,如果有资源需要清理,我们需要调用对应的destroy函数,来释放对应的资源,但是在C++中,我们还有一个默认成员函数,叫做析构函数

我们先说一下析构函数是什么,析构函数,就是在对象声明周期结束的时候会自动调用的函数,如果我们不写编译器会自动生成一个,析构函数的函数名是类名前面加~,并且也没有返回值,也没有参数,所以无法重载

我们来看一下

我们来看一下,是否会自动调用我们的析构函数,在对象生命周期结束的时候

 

我们看到,它足额是调用了对应的析构函数,那么我们还是上一个问题,如果我们不写,默认生成的析构函数会做什么呢??

我们编译器自动生成的析构函数,对内置类型不做处理,对自定义类型进行调用它自己的析构函数,这个是不是和上面的构造函数很相似

我们来看一下

我们继续看一下

 

该类中有两个stack的对象,在我们muQueue对象的生命周期结束的时候,我们的satck的析构函数会不会调用

 

我们看到,调用了对应的析构函数 

那么我们的析构函数需要自己写吗?或者是什么时候不需要自己写

1. 类中的成员变量都是自定义类型

2. 类中的成员变量,在生命周期结束的时候没有需要释放的资源

这两种时候我们不需要自己实现析构函数,编译器自动生成也可以,但是如果里面有需要自己释放的资源那么我们就需要自己实现析构函数

就像我们的stack类,它里面有_a,它需要自己开辟空间,在对象生命周期结束的时候需要释放掉malloc的内存,所以这个时候我们需要自己写析构函数

拷贝构造

我们在说拷贝构造之前,我们先说一个语法(也就是规定),在C++中我们的内置类型的传参都是拷贝,而我们的自定义类型的传参都是拷贝构造,所以我们的自定义类型的传参都是拷贝构造的

现在我们说一下什么是拷贝构造,拷贝构造也是构造函数的一种,不过拷贝构造的参数只能是自己的类型的引用

如果是我们的日期类的话我们就需要这样写,那么我们为什么要是引用呢?

我们来看一下如果不是引用会怎么样?

 

我们看到,报错了

但是为什么呢?

我们在刚开始的时候说了,在我们的C++中,我们的自定义类型的传值,就是拷贝构造,那么而我们想一下 请看下面

 

如果我们想要用d1 来拷贝构造 d3那么我们就会调用拷贝构造函数,所以我们会把d1传值给d3,但是我们的传值又是拷贝构造,而拷贝构造又需要传值,所以我们就陷入了死递归中,但是由于这里的语法就已经报错了,所以我们没办法看到这样的情景,所以我们如果拷贝构造不加引用的话就会报错,其实地址也可以,但是地址不好看。

那么如果我们不写拷贝构造,编译器自动生成的拷贝构造会干什么??

如果我们不写编译器自动生成的拷贝构造会完成,值拷贝(也就是浅拷贝),所以我们的Date类型的对象其实不写拷贝构造也可以,但是如果我们又开辟了内存的类型,我们就要自己写,因为默认的拷贝构造,会对对象进行按照字节序的浅拷贝,如果我们开了空间的话,我们的经过我们的浅拷贝,我们开辟的同一块空间就会被两个对象同时使用

我们来看一下

我们现在将Date类的拷贝构造屏蔽掉,我们来看一下,是否能完成拷贝

 

我们看到,我们确实对d3完成了拷贝,那么如果是我们需要开辟空间的呢??

 

我们还是刚才的stack类,我们并没有写该类对应的拷贝构造函数,如果我们之间拷贝会怎么样呢??

 我们看到崩溃了,可是为什么呢??

我们想一下,我们用s1 对s2进行浅拷贝,那么我们的s2里面的_a变量也指向s1里面_a指向的那块空间,但是在我们对象生命周期结束的时候我们会调用改对象的析构函数,所以我们会对s1 和s2析构由于我们析构完s2后我们的_a指向的空间已经被释放了,但是我们又对s1进行析构,我们再一次对s1中_a指向的空间进行释放,所以,我们对同一块空间释放了两次,所以我们的进程奔溃,我们来看一下我们是否完成的是浅拷贝

我们的_a指向的空间都是相同的,所以我们如果开辟了空间,就不能进行浅拷贝,需要深拷贝,这个我们之后会说,所以这里同一块空间被释放两次导致崩溃。

今天先只说这三个默认函数,剩下的我们下次说! 

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

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

相关文章

Raft 共识算法3-日志复制

Raft 共识算法3-日志复制 Raft算法中译版地址:https://object.redisant.com/doc/raft%E4%B8%AD%E8%AF%91%E7%89%88-2023%E5%B9%B44%E6%9C%8823%E6%97%A5.pdf 英原论文地址:https://raft.github.io/raft.pdf Etcd Assistant 是一款 etcd 可视化管理软件&a…

idea使用 ( 一 ) 安装及初步使用

1.介绍 1.1.什么是 IDE 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面]等工具。简单说就是开发工具,java开发中常用的…

一文读懂数据安全分级分类

目录 为什么要分级分类? 通用数据分级分类框架 数据分类 数据分类的常用方法 数据分类流程 数据分级 数据分级的常用方法 数据定级流程 行业数据安全分级分类指南 金融行业 电信行业 政务数据 健康医疗 企业实践 附录:数据分级分类大合集…

CAD格式交换全能:CAD DLL 15.0 Crack

添加对 SLDASM、FSAT、SAB、SMT、IPT 和 IFC 格式的支持。 2023 年 4 月 25 日 - 16:27 新版本 特征 改进的 3D: 打开 3D 文件时提高了速度。改进了对 SAT、STEP、SLDPRT、X_T、X_B、OBJ 格式的读取。添加了对 SLDASM、FSAT、SAB、SMT、IPT、IFC 格式的支持。添加了…

聊聊 maven的版本号version 以及maven指定版本号范围写法

1. 版本管理(version) 说了那么多废话,什么是版本管理?首先,一个健康的项目,通常有一个长期、合理的版本演变过程。版本管理是指项目整体版本的演变过程管理,就比如从1.0-SNAPSHOT --> 1.0 …

懂这3件事情,就能成功实施MES管理系统实现“数字化”工厂

当前,很多企业对MES管理系统需求旺盛,但是,要保证MES管理系统能够有效地实施,实现精益化管理,打造出一个“数字化”工厂,公司在实施MES管理系统之前,还必须弄明白为什么要MES管理系统、MES有什么…

QGIS数据可视化学习笔记04(完结)——POI检索和数据上图

一、POI数据检索概念 什么是POI检索?为什么要使用POI检索? 有的时候,我们可能不知道某个位置的地址,比如说北京朝阳图书馆,这个位置没有任何部门会去公布位置信息,但是我们又需要用到,这个时候就…

接口测试工具

工作当中有不少时间在编写和维护接口自动化测试用例。打算先整理一些接口相关工具的使用。 简单对接Web口测试的相关工具/技术做个划分。 HTTP/SOAP协议接口的功能测试: 1、浏览器URL(GET请求) 2、浏览器插件:Poster、Postman 简单…

科学防雷接地和雷电防护方案

说到防雷,可能不少人首先会想到避雷针,而“避雷针”这一概念,很容易让大家对防雷的概念造成误解。 误解1: 避雷针是用来“避雷”的。 其实,避雷针的学名叫“接闪器”,不是用来“避开雷击”的,而是用来“迎…

AI绘画——Checkpoint模型Dark Sushi Mix 大颗寿司Mix

目录 版本解析 模型简介 模型特性 模型演示(多图预警) Picture One 正面tag: 负面tag: Checkpoint模型darkSushiMixMix无Vae Checkpoint模型darkSushiMixMixVae模型kl-f8-anime2.ckpt Picture Two 正面tag:…

虹科案例|虹科Micronor光纤传感器,实现核磁共振新应用!

PART 1 背景介绍 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。将患者的某些活动与MRI成像系统同步是越来越受重视的需求。磁场强度随着每一代的发展而增大,因此,组件的电磁透明度在每一代和新应用中变得更加重要。 光学传…

Oracle系列之九:Oracle常用函数

Oracle常用系统函数 1. 字符串函数2. 数学函数3. 日期函数4. 聚合函数5. 其他 Oracle是一种关系型数据库管理系统,它提供了许多内置函数,以便用户可以更轻松地处理数据。 1. 字符串函数 (1)lengthb/length 计算字符串长度 len…

C++ POCO库的基础介绍(Windwos和Linux)

简单介绍C POCO库能干什么,后续有时间的话将根据其每个点详细解析,关注我。本篇包含POCO库简单介绍、下载以及安装方式、简单代码示例。 目录 一、POCO简单介绍 1.1 POCO库的基本模块 1.2 POCO库的优点 二、POCO库安装方式 2.1下载源代码编译安装 …

Golang每日一练(leetDay0047)

目录 138. 复制带随机指针的链表 Copy List with Random-pointer 🌟🌟 139. 单词拆分 Word Break 🌟🌟 140. 单词拆分 II Word Break II 🌟🌟🌟 🌟 每日一练刷题专栏 &…

100种思维模型之指数对数思维模型-54

对数、指数,生活中的2种增长曲线;对数增长曲线,即在开始时增长很快,但随着时间的推移,收益会减少并变得更加困难;而指数增长曲线,即开始时增长缓慢,但随着时间的推移,收益…

《计算机网络——自顶向下方法》精炼——2.5-2.6.1

“Be the change you wish to see in the world.” - Mahatma Gandhi 文章目录 DNSDNS概述DNS的组成DNS的服务 DNS运行过程DNS的分布式数据库本地DNS服务器DNS的运行过程递归查询、迭代查询 DNS缓存DNS记录DNS报文首部区域问题区域回答区域权威区域附加区域 插入DNS记录 P2PP2P…

【Shell脚本】shell编程规范与变量

shell编程规范与变量 一、shell脚本概述1.1shell概念1.2Linux有哪些shell1.3shell脚本的作用 二、编写shell脚本的规范2.1编写shell脚本的规范2.2运行shell脚本的两种方法 三、重定向与管道操作3.1交互式与硬件设备3.2重定向操作3.3管道符号 “|” 四、shell变量的作用、类型4.…

WSL2和Windows之间通信实现【以Unity为例】

WSL2可以视为一个独立的虚拟机,具有自己独立的IP地址,通过虚拟路由器与Windows连接,因此WSL2不能直接访问到Windows的主机地址,需要动态获取。 (1)Windows启用防火墙的WSL2的访问 默认情况下Windows的防火…

陆奇-奇绩创坛-chatGPT新范式,新时代,新机会

奇绩创坛-新范式,新时代,新机会 01-新范式 新范式的新拐点 新范式的历史环境 新范式的社会影响 新范式的缔造者:Sam Altman和OpenAI 新范式的动力引擎 新范式的演化路径 02-新时代 新时代的宏观发展格局 新时代的中国机会 新时代的OpenAI生…

个人复盘和总结 2022——2023

个人心路历程: 从2022年开始接触编程到现在已经断断续续的有一年了。回顾这一年,感觉有进步也有做的不足的地方。好的是从一开始的什么都不会,到现在的至少对计算机有点了解,从C语言到c到Linux系统编程再到Linux网络编程&#xf…