【C++】类和对象——构造函数和析构函数

今天要学习两个特殊的函数,分别是构造函数析构函数,它们究竟有什么用呢?
比如说,我们先写一个简单的日期的类

class Date {
public:void Init() {_year = 1;_month = 1;_day = 1;}void Print() {cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main() {Date d1;d1.Init();d1.Print();return 0;
}

我们要定义一个对象后还要对这个对象进行初始化只要定义对象就要初始化,这个步骤是不是有点太繁琐了,甚至我们有时候还会忘记初始化,所以这时,就创造了一种函数叫做构造函数,它其实就是去完成了初始化这个工作,并且它是在对象创建后自动调用的,是不是就让我们省心了不少
它的一些规则是这样的:

1.函数名与类名相同,意思是在日期这个例子中,构造函数的函数名也叫Date
2.无返回值,这里的无返回值意思不是写void,而是根本就不需要写返回值
3.对象实例化(创建对象)时编译器自动调用对应的构造函数
4.构造函数可以重载

比如说我去写一个构造函数

class Date {
public:Date(int year,int month,int day) {_year = year;_month = month;_day = day;}void Print() {cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main() {Date d1(2023,11,22);d1.Print();return 0;
}

这时就可以替换掉Init函数,并且调用的话也是这么去调用,规则的第四条是什么意思呢?构成重载嘛,就是构成重载的函数可以同时存在,比如说

	Date() {_year = 1;_month = 1;_day = 1;}Date(int year,int month,int day) {_year = year;_month = month;_day = day;}

当我去传参调用的话就调用第二个,当我不传参调用就调用第一个,不会产生歧义
在这里插入图片描述
我们又知道有缺省参数这回事,如果我们给第二个构造函数缺省值的话
在这里插入图片描述
那我不传参调那个呢?结果是编译出错,因为调用有歧义
我们已经知道,如果不给构造函数的话,对于日期类(其实也就是内置类型)编译器不会自动去调用构造函数。那如果是自定义类型呢?那编译器就会去调用自定义类型的构造函数,如果自定义类型也没写构造函数,那编译器也无法去调用。
所以在C++11中,内置类型是可以给值的,比如说
在这里插入图片描述
就是在声明的时候后面给上值,这时如果没有构造函数的话,就会用给定的值去初始化,就像这样
在这里插入图片描述
这种情况我们是不是没有写构造函数,可是数据还是初始化了,这时我们就有了一个默认构造的概念,总的来说,我们不去传参数调用的构造函数,都可以叫做默认构造。除了这种情况,还有无参构造函数全缺省构造函数也可以叫默认构造。这三种情况是不能同时存在的
那我们在看看下面这种情况
在这里插入图片描述
构造函数不给缺省值,并且在调用的时候也不给值,这样是会报错的
因为我既然不给d1传值,但是它有构造函数,不传参数就无法调用这个构造函数
有了所谓的初始化函数,那我们是不是也需要一个销毁函数呢?这样就有了我们的析构函数,这里的析构函数其实不是完成对对象本身的销毁,而是完成对象中资源的清理工作(比如说,当一个日期类的对象生命周期结束时,它调用析构函数是没有多大意义的,因为它的年月日随着栈帧的销毁就一并销毁了;但是对于一个栈,它是在堆上申请过空间的,这时把堆上的空间要释放掉是非常有必要的),它的规则如下

1.析构函数名是在类名前加上~
2.无参数,无返回值类型
3.一个类只能有一个析构函数,若未显示定义,系统会自动生成默认的析构函数,并且析构函数不能重载,因为根本就没有参数嘛
4.对象生命周期结束时,会自动调用析构函数

大概就是这样子的
在这里插入图片描述
可以看到,一个对象的创建和生命周期结束确实会自动调用构造函数和析构函数
这里打印的话就是为了表示一下是否调用了该函数和什么时候调用析构函数

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.lang.IllegalStateException: Can not add resource

安卓解决 java.lang.IllegalStateException: Can not add resource 放两个链接 解决Can not add resource (com.android.aaptcompiler.ParsedResourcea980fbb) to table_言并肃的博客-CSDN博客 android attr何时会冲突_android attr冲突-CSDN博客 然后去新增的依赖找资源…

IOS+Appium+Python自动化全实战教程

由于公司的产品坐落于不同的平台&#xff0c;如ios、mac、Android、windows、web。因此每次有新需求的时候&#xff0c;开发结束后&#xff0c;留给测试的时间也不多。此外&#xff0c;一些新的功能实现&#xff0c;偶尔会影响其他的模块功能正常的使用。 网上的ios自动化方面的…

jQuery的学习(一篇文章齐全)

目录 Day29 jQuery 1、jQuery介绍 2、jQuery的选择器 2.1、直接查找 2.2、导航查找 3、jQuery的绑定事件 案例1&#xff1a;绑定取消事件 案例2&#xff1a;模拟事件触发 4、jQuery的操作标签 tab切换案例jQuery版本&#xff1a; 案例1&#xff1a; 案例2&#xff…

Spring cloud - Hystrix源码

其实只是Hystrix初始化部分&#xff0c;我们从源码的角度分析一下EnableCircuitBreaker以及HystrixCommand注解的初始化过程。 从EnableCircuitBreaker入手 我们是通过在启动类添加EnableCircuitBreaker注解启用Hystrix的&#xff0c;所以&#xff0c;源码解析也要从这个注解…

雷电模拟器打开指针位置无效果解决方法(开发者模式)

预期效果 1.打开文件所在位置 2.进入vms目录 3.新建一个名为debug的txt格式的文件 4.打开开发者模式里面指针位置的选项 5.重启模拟器 6.噔噔噔噔~

面试官:什么是三色标记

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

最新PHP熊猫头图片表情斗图生成源码

这是一款能生成熊猫头表情斗图的自适应系统源码&#xff0c;无论是在电脑还是手机上都可以正常使用&#xff01;这个源码集成了搜狗搜索图片接口&#xff0c;可以轻松地一键搜索数百万张图片&#xff0c;并且还包含了表情制作等功能模块。对于一些新站来说&#xff0c;这是一个…

功率放大器在无线收发系统中的作用

功率放大器在无线收发系统中也扮演着至关重要的角色。无线通信是一种通过电磁波传输信息的技术&#xff0c;它具有便捷、灵活、广覆盖等优势&#xff0c;在现代社会得到了广泛应用。而功率放大器则是无线收发系统中的核心组件之一&#xff0c;主要用于增强信号的功率和距离。下…

代码规范之-理解ESLint、Prettier、EditorConfig

前言 团队多人协同开发项目&#xff0c;困扰团队管理的一个很大的问题就是&#xff1a;无可避免地会出现每个开发者编码习惯不同、代码风格迥异&#xff0c;为了代码高可用、可维护性&#xff0c;需要从项目管理上尽量统一和规范代码。理想的方式需要在项目工程化方面&#xff…

飞书CEO谢欣:绝大部分企业希望拥抱AI,但并未做好准备

11月22日&#xff0c;飞书在北京举办了产品发布会&#xff0c;正式发布“飞书智能伙伴”等系列AI产品。“飞书智能伙伴”有知识、有记忆&#xff0c;有主动性&#xff0c;也能深入到业务中。在内容创作、内容总结、数据分析、场景构建、系统搭建等业务场景&#xff0c;用户均可…

代码随想录二刷 |链表 | 链表总结

代码随想录二刷 &#xff5c;链表 &#xff5c; 链表总结 理论基础分类单链表双链表环形链表 存储方式链表的定义链表操作删除链表节点添加链表节点 性能分析 移除链表元素在原链表上移除虚拟头节点移除 设计链表反转链表双指针递归 两两交换链表节点移除链表的倒数第 N 个节点…

BUUCTF 梅花香之苦寒来 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;得到的 flag 请包上 flag{} 提交 密文&#xff1a; 下载附件&#xff0c;解压得到一张.jpg图片。 解题思路&#xff1a; 1、用010 Editor看了一下&#xff0c;刚开始以为是修改宽高的题&#xff…