【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.对象生命周期结束时,会自动调用析构函数

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 运行机制

文章目录 JavaScript 运行机制目标知识要点一、进程与线程1.1 概念1.2 区别1.3 多进程与多线程1.4 JS 为什么是单线程1.5 浏览器1.5.1 浏览器包含哪些进程1.5.2 为什么浏览器要多进程1.5.3 渲染进程1.5.3.1 GUI 渲染线程1.5.3.2 JS 引擎线程1.5.3.3 事件触发线程1.5.3.4 定时触…

Windows权限维持方法论

Windows权限维持方法论 1.注册表自启动2.组策略设置脚本启动3.计划任务4.服务自启动5.dll劫持6.直接上远程控制木马 1.注册表自启动 通过修改注册表自启动键值&#xff0c;添加一个木马程序路径&#xff0c;实现开机自启动 常用的注册表启动键&#xff1a; # Run键 HKEY_CU…

echarts移动markline(拖拽单条markline)

echarts移动markline&#xff08;拖拽单条markline&#xff09; 效果 问题由来&#xff1a; 图表中需要一个移动的标线&#xff0c;辅助观察图表&#xff1b; 想法&#xff1a; 意思是在原来点或者原来标线上新增一个图层&#xff0c;拖动图层动态绘制新的点或者新的标线; 参考…

【C++初阶】STL详解(五)List的介绍与使用

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

万字解析:十大排序(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序+归并排序+计数排序+基数排序+桶排序)

文章目录 十大排序排序算法复杂度及稳定性分析一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四…

这是大学生就业网站最基础的布局。

<!DOCTYPE html> <html> <head> <title>大学生就业网站</title> <style> /* Reset default margin and padding */ *, *::before, *::after { margin: 0; padding: 0; box-s…

算法刷题-动态规划2

算法刷题-动态规划2 珠宝的最高价值下降路径最小和 珠宝的最高价值 题目 大佬思路 多开一行使得代码更加的简洁 移动到右侧和下侧 dp[ i ][ j ]有两种情况&#xff1a; 第一种是从上面来的礼物最大价值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二种是从左…

FPGA设计时序约束九、others类约束之Group Path

目录 一、序言 二、Group Path 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考文件 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时序路径分…

如何判断客户对你是不是真的满意

我们平时生活中打个滴滴、叫个外卖&#xff0c;都会让做星级评价&#xff0c;就算去银行办业务&#xff0c;也会让按个按钮&#xff0c;对窗口的服务做个评价…… 再问一个问题&#xff1a;客户满意了&#xff0c;您的生意就一定好吗&#xff1f; 一、满意度&#xff1a;质量监…

EDIFACT学习手册

EDIFACT 又名 UN/EDIFACT&#xff08;全称为 United Nations/Electronic Data Interchange For Administration, Commerce and Transport&#xff09;&#xff0c;是由联合国主导开发制定的国际通用 EDI 标准。EDI术语中的EDIFACT是指 EDIFACT 报文标准&#xff0c;本视频将为大…

python接口自动化封装导出excel方法和读写excel数据

一、首先需要思考&#xff0c;我们在页面导出excel&#xff0c;用python导出如何写入文件的 封装前需要确认python导出excel接口返回的是一个什么样的数据类型 如下&#xff1a;我们先看下不对返回结果做处理&#xff0c;直接接收数据类型是一个对象&#xff0c;无法获取返回…

Postman API Enterprise 10.18.1 Crack

适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段&#xff0c;Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗&#xff1f;希望减少开发和质量检查之间的滞后时间&#xff1f;想要更快地让新开发…

2023年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 点击绿旗,运行程序后,舞台上的图形是?( ) A:画笔粗细为4的三角形 B:画笔粗细为5的六边形 C:画笔粗细为4的六角形 D:画笔粗细为5的三角形 答案:D 第2题 如下图所示,从所给…

AI一点通:卷积神经网络的输出节点大小如何计算?全连接层必要输入大小如何设置

在使用卷积网络&#xff08;CNN&#xff09;时&#xff0c;一个步骤是计算经过卷积和池化步骤后的输出大小&#xff0c;以便我们可以将输出连接到一个完全收集的线性层。 以Pytorch中的一维CNN为例&#xff0c; self.conv1 nn.Conv1d(in_channels1, out_channels64, kernel_s…

地图导航测试用例,你get了吗?

地图导航是我们经常使用的工具&#xff0c;能帮助我们指引前进的方向。 接下来&#xff0c;会从功能测试、UI测试、兼容测试、安全测试、网络测试、性能测试、易用性测试、文档和国际化语言测试8个方面来编写地图导航测试用例。 一 功能测试 输入起点和终点&#xff0c;验证…

你了解Postman 变量吗?

变量是在Postman工具中使用的一种特殊功能&#xff0c;用于存储和管理动态数据。它们可以用于在请求的不同部分、环境或集合之间共享和重复使用值。 Postman变量有以下几种类型&#xff1a; 1、环境变量&#xff08;Environment Variables&#xff09;: 环境变量是在Postman…

【Linux】权限的理解和使用

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

使用Java Servlet生成动态二维码

文章目录 引入ZXing库创建QRCodeServlet部署到Servlet容器拓展功能1. 动态生成二维码内容2. 调整二维码尺寸3. 错误修正级别4. 日志输出 结语 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&…

【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】

MR 单词统计流程 已知文件内容: hadoop hive hadoop spark hive flink hive linux hive mysql ​ input结果: k1(行偏移量) v1(每行文本内容)0 hadoop hive hadoop spark hive 30 flink hive linux hive mysql map结果:k2(split切割后的单词) v2(拼接…

Windows配置Anaconda环境

1、下载Anaconda 2、安装Anaconda 2.1、系统环境变量 注&#xff1a; 将Anaconda添加到系统环境变量中&#xff0c;此处建议选中&#xff0c;可以省去好多麻烦 2.2、手动配置环境变量 系统—高级系统设置—环境变量—Path—新建&#xff1b;将下面的路径添加到环境变量中…