NzN的C++之路--构造函数与析构函数
如果一个类中既没有成员变量也没有成员函数,这个类简称为空类。空类中其实并不是什么都没有,任何类在什么都不写时,编译器会自动生成6个默认成员函数。那今天我们就来学习一下其中两个默认成员函数:构造函数与析构函数。先三连后看才是好习惯!!!
目录
一、类的6个默认成员函数
二、构造函数
1. 概念
2. 特性
三、析构函数
1. 概念
2. 特性
一、类的6个默认成员函数
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。一旦用户自己显式实现这些函数,编译器就不会自动生成。
二、构造函数
1. 概念
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。
构造函数是特殊的成员函数,构造函数并不是创造函数,它并不是开空间创建对象,而是初始化对象,与Init函数的作用类似。
2. 特性
- 函数名与类名相同。
- 无返回值,但是这里不需要写void。
- 对象实例化时由编译器自动调用对应的构造函数。
class Date
{
public:Date(){_year = 2024;_month = 4;_day = 5;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();return 0;
}
- 构造函数可以重载。可以有多个构造函数、多种初始化方式。
class Date
{
public://无参构造函数Date(){ _year = 1;_month = 1;_day = 1;}//有时候也会把带参构造函数写成全缺省的,方便调用Date(int year = 1, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}//但是由于全缺省的带参构造函数使用时可以不需要自己传递参数//Date类实例化一个对象,并没有参数时,会出现错误//我们一般选择保留全缺省的带参构造函数,因为他也可以实现无参传递的功能
private:int _year;int _month;int _day;
};
void TestDate()
{Date d1;//调用无参构造函数Date d2(2005, 5, 17); //调用带参的构造函数//注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明Date d3();//声明了d3函数,该函数无参,返回一个Date类型的对象
}
- 如果没有显式定义构造函数,则编译器会自动生成一个无参的默认构造函数。
class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();
}
大家可以自行运行一下上面这段代码,为了方便讲解,我在下面直接给出在VS2022里运行后的结果。
C++把类型分为内置类型(int、char、float…)和自定义类型(struct、class、union…)。当没有显示定义构造函数时,C++规定对内置类型是否处理不作规定(可能是0也可能是随机值,这与编译器有关),但自定义类型一定会调用默认构造函数。
注意:无参构造、全缺省构造、编译器默认生成的构造函数,都是默认构造函数(不传参就可以使用),但是默认构造函数只能有一个。
_aa是自定义类型,会调用自己的默认构造函数,在A中显式提供了默认构造函数,因此就直接按照显式提供的默认构造函数进行初始化。
对于内置类型,如果显式给了构造方法,但这个构造方法需要传递参数,此时编译器不会提供不需要传参就可以调用的构造函数,而我们并没有给他传递参数,此时就会报错。
当我们给了缺省值,这里还会打印2024-4-10,因为我们给了指定的值就不会用缺省值了。这里其实只是普通的构造函数,因为我们必须要传递参数才可以使用这个构造方法。
注意:不传参就可以使用的是默认构造函数,传参才能使用的只是普通的构造函数。
class A
{
public://A( )A(int a = 1){_a = 0;cout << "A( )" << endl;}
private:int _a;
};
如果显式给出的构造方法无参或是全缺省的构造方法,就可以正常运行,这都属于不需要传参就可以调用的默认构造函数。
class A
{
public:private:int _a;
};
此时A没有显式提供构造函数,编译器会提供默认构造函数。_a是内置类型,因此是随机值。
C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给缺省值。
注意:这里是给缺省值,而不是对变量初始化。因为这里只是声明,只有用类实例化对象时才会开空间。
【总结】
一般情况下,都是需要自己显式实现默认构造函数的;除非一些特殊情况,如用两个栈实现队列这种,在队列里声明的全是栈的自定义类型,可以让编译器默认生成。
三、析构函数
1. 概念
与构造函数功能相反,析构函数不是完成对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
2. 特性
- 析构函数名是在类名前加上字符 ~。
- 无参数无返回值类型。
- 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
- 对象生命周期结束时会自动调用析构函数。允许显式调用,一般不会显式调用。
typedef int DataType;
class Stack
{
public://默认构造函数Stack(size_t capacity = 3){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (NULL == _array){perror("malloc fail");return;}_capacity = capacity;_size = 0;}void Push(DataType data){// CheckCapacity();扩容省略_array[_size] = data;_size++;}//析构函数~Stack(){if (_array){free(_array);_array = NULL;_capacity = 0;_size = 0;}}
private:DataType* _array;int _capacity;int _size;
};
与构造函数相似,当我们没有显示提供析构函数时,对于内置类型,编译器不做处理;自定义类型会由编译器调用其默认析构函数。
注意:析构函数不能重载。
【总结】
有资源申请时,一定要写析构函数,否则会造成资源泄漏,比如Stack、List。类中没有申请资源时,或是内置类型没有资源清理、剩下的全是自定义类型时可以直接使用编译器生成的默认析构函数。
相关文章:
NzN的C++之路--构造函数与析构函数
如果一个类中既没有成员变量也没有成员函数,这个类简称为空类。空类中其实并不是什么都没有,任何类在什么都不写时,编译器会自动生成6个默认成员函数。那今天我们就来学习一下其中两个默认成员函数:构造函数与析构函数。先三连后看…...
【算法刷题day24】Leetcode:216. 组合总和 III、17. 电话号码的字母组合
文章目录 Leetcode 216. 组合总和 III解题思路代码总结 Leetcode 17. 电话号码的字母组合解题思路代码总结 草稿图网站 java的Deque Leetcode 216. 组合总和 III 题目:216. 组合总和 III 解析:代码随想录解析 解题思路 回溯三部曲:确定递归…...
一体化泵站的生产制造流程怎样
诸城市鑫淼环保小编带大家了解一下一体化泵站的生产制造流程怎样 综合泵站和传统式混泥土泵站的一大差别是,离去制造厂前,能够开展全部机械设备设备的生产加工及零部件加工,随后运送到建筑项目当场开展安裝。这类经营方式缩短了开发周期&…...
【1】C++设计模式之【单例模式】
单例模式在C中的实现方式有以下几种: 懒汉式(线程不安全)饿汉式(线程安全)双检锁/双重校验锁(DCL,线程安全)静态局部变量(线程安全)C11版本(线程…...
软件设计模式之解释器模式
一、引言 在软件设计中,我们经常遇到需要“解释”和执行某种特定语法或语言的情况。这时,解释器模式就派上了用场。解释器模式(Interpreter Pattern)是一种行为设计模式,它提供了一种解释语言的语法并定义一个句子如何…...
java Web课程管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc
一、源码特点 JSP 课程管理系统是一套完善的web设计系统,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用ja…...
Electron 桌面端应用的使用 ---前端开发
Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门…...
【SpringBoot:详解Bean装配】
🏡Java码农探花: 🔥 推荐专栏:<springboot学习> 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、IoC容器的简介BeanFactory接口源码二、Bean装配扫描装配探索启动类条件装配自定义Bean总…...
前端如何将接口返回的码值转成对应的中文展示呢?
后端接口只返回码值,那前端如何将码值转成对应的中文展示呢? 项目中后端接口都是将码值返给前端,前端通过公共获取码值的接口然后将其对应转码 以下是举例操作: created() {//这是公共接口的码值表let oneType [{value: 01,content: 一类,},{value: 02,content: 二类,},];//…...
智慧公厕中的大数据、云计算和物联网技术引领未来公厕管理革命
现代社会对于公共卫生和环境保护的要求越来越高,智慧公厕作为城市基础设施建设的重要组成部分,正引领着公厕管理的革命。随着科技的不断进步,大数据、云计算和物联网技术的应用为智慧公厕带来了全新的可能性,(ZonTree中…...
Excel与项目管理软件比较?哪个是项目组合管理的最佳选择?
在定义和管理每个正在进行的项目的资源、任务、收益、风险和优先级时,项目组合管理已成为公司的战略要素。为了实现高效的项目组合管理,PMO 经理需要评估Excel 是否满足他们管理项目组合的需求,或者是否应该尝试不同的解决方案,例…...
过程控制风格的软件架构设计概念及其实际应用
摘要 过程控制风格的软件架构设计强调程序的流程控制逻辑和组件之间的交互方式,旨在提升系统的响应性、扩展性和可维护性。这种架构风格在需要严格的操作序列和流程控制的应用中尤为重要,例如在嵌入式系统、实时系统和复杂的业务流程管理中。本文将介绍…...
WPF 编辑器模式中隐藏/显示该元素
XAML中引用:xmlns:d"http://schemas.microsoft.com/expression/blend/2008" 在所需要的控件中加上d:Visibility"Visible"属性 d:Visibility属性有3个值,可以根据需要进行设置 转自:在Visual Studio设计器中隐藏WPF元素…...
分布式事务 - 个人笔记 @by_TWJ
目录 1. 传统事务1.1. 事务特征1.2. 事务隔离级别1.2.1. 表格展示1.2.2. oracle和mysql可支持的事务隔离级别 2. 分布式事务2.1. CAP指标2.2. BASE理论2.3. 7种常见的分布式事务方案2.3.1. 2PC2.3.2. 3PC2.3.3. TCC2.3.3.1. TCC的注意事项:2.3.3.2. TCC方案的优缺点…...
解决前端笔记本电脑屏幕显示缩放比例125%、150%对页面大小的影响问题--数据可视化大屏
近期在工作中遇到一个问题,记录一下,在项目上线之后,遇到一个问题,即缩放到90%时,页面字体比默认的100%字体大,一开始毫无头绪,经过一番的Google...Google...Google....,终于找到了解…...
【PG-1】PostgreSQL体系结构概述
1. PostgreSQL体系结构概述 代码结构 其中,backend是后端核心代码,包括右边的几个dir: access:处理数据访问方法和索引的代码。 bootstrap:数据库初始化相关的代码。 catalog:系统目录(如表和索引的元数据…...
jq命令简易教程——Linux中处理JSON数据的利器
在shell脚本中,当我们需要对JSON数据(例如ceph、kubernetes等一些命令的输出,或是调用API获得的响应)进行处理和提取时,如果使用传统的文本三剑客sed、awk和grep,命令将会非常臃肿不可读。虽然这三个命令在…...
前端开发攻略---Vue实现防篡改水印的效果。删除元素无效!更改元素属性无效!支持图片、元素、视频等等。
1、演示 2、水印的目的 版权保护:水印可以在图片、文档或视频中嵌入作者、品牌或版权所有者的信息,以防止未经授权的复制、传播或使用。当其他人使用带有水印的内容时,可以追溯到原始作者或版权所有者,从而加强版权保护。 身份识…...
在Go语言中复制sync类型
sync包提供了基本的同步原语,例如互斥锁、条件变量和等待组。对于所有这些类型,有一个硬性规则要遵循:它们永远不应该被复制。让我们来理解下这个原理和可能发生的问题。 我们将创建一个线程安全的数据结构来存储计数器。它将包含一个map[string]int,表示每个计数器的当前值…...
Golang | Leetcode Golang题解之第25题K个一组翻转链表
题目: 题解: func reverseKGroup(head *ListNode, k int) *ListNode {hair : &ListNode{Next: head}pre : hairfor head ! nil {tail : prefor i : 0; i < k; i {tail tail.Nextif tail nil {return hair.Next}}nex : tail.Nexthead, tail my…...
【初学】前后端flask+vue组合GET案例
【CSDN 目录配置很不好用】 一、python配置 pip install flaskpip install flask-cors 二、vue配置 1.下载node.js 2.安装node.js 3.测试 node -v4.在vue项目文件夹中创建vue项目 npm create vue@latest第一次会安装一个东西,然后输入名称,一路回车 ✔ Project name…...
计算机科学与技术CS考研408资料
在github上整理了考研的一些资料: 内容包括: 参考书数据结构、组成原理、操作系统、计算机网络.408笔记PDF408思维导图408真题2009-2021真题无logo版408真题2029-2023王道真题(持续更新)历年真题考频统计灰灰考研择校࿰…...
ACID模型是什么
ACID模型是什么 ACID模型是数据库管理系统中保证事务处理安全性的一组特性。ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个英文单词的…...
【Linux】基础IO----理解缓冲区
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:理解缓冲区 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自:Linux初阶 > 望…...
java学习之路-继承
文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处,为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…...
Linux系统——Elasticsearch企业级日志分析系统
目录 前言 一、ELK概述 1.ELK简介 2.ELK特点 3.为什么要使用ELK 4.完整日志系统基本特征 5.ELK工作原理 6.Elasticsearch介绍 6.1Elasticsearch概述 6.2Elasticsearch核心概念 7.Logstash介绍 7.1Logstash简介 7.2Logstash主要组件 8.Kibana介绍 8.1Kibana简介 …...
多协议接入视频汇聚EasyCVR平台vs.RTSP安防视频EasyNVR平台:设备分组的区别
EasyCVR视频融合云平台则是旭帆科技TSINGSEE青犀旗下支持多协议接入的视频汇聚融合共享智能平台。平台可支持的接入协议比EasyNVR丰富,包括主流标准协议,有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海…...
Spring Security Oauth2 之 理解OAuth 2.0授权流程
1. Oauth 定义 1.1 角色 OAuth定义了四个角色: 资源所有者 一个能够授权访问受保护资源的实体。当资源所有者是一个人时,它被称为最终用户。 资源服务器 托管受保护资源的服务器能够使用访问令牌接受和响应受保护的资源请求。 客户 代表资源所有…...
mysql题目4
tj11: select count(*) 员工总人数 from tb_dept a join tb_employee b on a.deptnob.deptno where a.dname 市场部...
GFS部署实验
目录 1、部署环境 编辑 2、更改节点名称 3、准备环境 4、磁盘分区,并挂载 5. 做主机映射--/etc/hosts/ 6. 复制脚本文件 7. 执行脚本完成分区 8. 安装客户端软件 1. 安装解压源包 2. 创建gfs 3. 安装 gfs 4. 开启服务 9、 添加节点到存储信任池中 1…...
js做网站登录界面/广告投放怎么做
Pytorch Note55 迁移学习实战猫狗分类 文章目录 Pytorch Note55 迁移学习实战猫狗分类加载数据集迁移学习网络定义训练模型的函数定义一个测试的函数1.AlexNet2.VGG163.ResNet184.DenseNet5.MobileNet V26.ShuffleNetV2总结全部笔记的汇总贴: Pytorch Note 快乐星球 在这一部…...
湖南做网站公司/seo教学网站
要想在地址栏隐藏url传递的参数,不能直接隐藏,但有几下几个变通的方法. 使用类似Base64编码,将URL参数进行简单加密. 使用框架页; 使用POST方式传递数据; 使用Cookie传递数据; 下面主要介绍模拟表单提交的post方式: function post(URL, PARAMS) {var tem…...
网站的下载链接怎么做/网站服务器一年的费用
场景:我们想要在php7扩展中调用用户自定的类中的方法,而且方法有多个参数,找到以下方 法,没有看到可以超过两个参数的方法。所以一直向下查找,发现zend_call_method调用的 zend_call_function,但是并非只能…...
建设银行卡如何网站激活/seo什么意思中文意思
1. 注意:如果想使用Subtitle类型的单元格,需在Storyboard中将Protocell设置为subtitle类型,且Protocell的identifier必须与ViewController中cellForRow方法设置,保持一致,才能保证在subtitle行内容被显示出来。 - (UI…...
做外贸没有网站需要注意什么/搜狗关键词优化软件
一、搜索“无线诊断”应用程序 二、在“无线诊断”应用程序中找“嗅探器”...
一站式建设网站/北大青鸟培训机构靠谱吗
软件开发模型 瀑布模型、敏捷模型、DevOps 软件测试模型 V模型、W模型、H模型 V模型:需求分析、概要设计(【开发】框架,接口)、详细设计(【开发】模块内部如何实现)、编码(【开发】ÿ…...