【c++————————构造函数和析构函数】

news/2024/5/19 0:43:20 标签: c++, 开发语言, 构造函数, 析构函数

【c++————————构造函数析构函数


在这里插入图片描述

欢迎阅读新一期的c++模块————构造函数析构函数

✒️个人主页:-Joker-

🏷️专栏:C++

📜代码仓库:c_code

🌹🌹欢迎大佬们的阅读和三连关注,顺着评论回访🌹🌹


文章目录


构造函数

在之前C语言的学习中中我们通常会使用一个函数Init来对对象进行初始化,而在C++中为我们提供了一个新的函数来进行初始化————构造函数

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象,
即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数
,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。


`

构造函数的特性

1.默认构造函数

在C++中,我们将不给出实参的构造函数统称为默认构造函数
在C++中,我们可以这样来使用默认构造函数
例如

class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	Date()
	{
		_year = 2023;
		_month = 12;
		_day = 31;
	}
	void Display();
};

在上面的代码中,Date()就是对我们的默认构造函数,它的作用是初始化我们的_year等对象。

另外,在当我们忘记写显示构造函数的时候,编译器会自动默认给我们写上一个无参的构造函数(默认构造函数),但是编译器给我们的是一个不含任何语句的默认构造函数,所以,如果我们需要在默认构造函数内进行赋值,就必须手动写默认构造函数。另外,如果我们写了显示构造函数的话,编译器就不会帮我们自动添加默认构造函数

2.含参的构造函数

和函数一样,构造函数也分为了含参和不含参。
例如

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

这个Date就是一个含参的构造函数,但是需要注意,在默认构造函数中,我们可以不添加参数,但是当我们一旦添加了含参的构造函数以后,我们就需要在定义对象的时候添加参数。这里同样可以通过缺省参数的方式来自己添加需要传的参数,可以部分缺省,也可以全缺省。

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

3.构造函数的重载

构造函数同样也支持函数重载(函数名需要保持一致,但是参数类型和顺序必须不一致)。

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

Date(long long year=2023,int month=12,long long day=31
{
	_year=year;
	_month=month;
	_day=day;
}

4.在一个类里面,有且只能存在一个构造函数


析构函数

析构函数的作用和构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

我们在定义析构函数的时候要在函数名前面加上‘~”,并且和构造函数相同,析构函数也没有参数、返回值和类型。

class stack
{
private:
	int top;
	int* a;
	int capacity;
public:
	stack(int n);
	void pushstack(int *p,int x);
	~stack();

~stack()就是一个析构函数

2.和构造函数一样,一个类里面也只能有一个析构函数,并且析构函数并不能进行重载。

3.默认析构函数

在我们写类和对象时,如果没有添加析构函数,编译器就会默认给我们添加一个析构函数-默认析构函数,但是他和默认构造函数不同,默认构造可以进行操作,而默认析构函数什么也不会做。

4.析构函数的使用场所

当我们需要对空间资源进行开辟的时候,我们需要写一个析构函数来对我们所开辟的空间进行资源释放。另外,如果我们不需要申请资源,我们也可以选择不写析构函数,但是如果有申请就必须写上,不然会造成资源的浪费或泄露。

构造函数析构函数的调用顺序


构造函数析构函数的调用顺序为:

先构造的后析构,后构造的先析构

例如下面的程序

class DateTime
{
public:
	DateTime()
	{
		cout << "DateTime()" << endl;
	}
	~DateTime()
	{
		cout << "~DateTime()" << endl;
		_hours = 0;
		_minutes = 0;
		_seconds = 0;
	}
private:
	int _hours;
	int _minutes;
	int _seconds;
};

class Date
{
private:
	int _year = 2023;
	int _month = 12;
	int _day = 31;
	// 自定义类型
	DateTime dt;
};
int main()
{
	Date d1;
	Date d2;
	return 0;
}

在这里插入图片描述


总结

一般来说,如果在全局范围定义对象,那么它的构造函数在本文件模块中的所有函数执行之前调用,如果一个程序包含多个文件,那么它的构造函数的调用顺序是不确定的,当main函数结束或者调用exit结束程序时,调用析构函数

如果定义局部对象,那么定义时自动调用构造函数。函数调用结束时,自动调用析构函数


以上就是关于构造函数析构函数的内容,今年的最后一片博客了!各位佬们麻烦支持一波,顺着评论回访🌹🌹🌹


http://www.niftyadmin.cn/n/5297916.html

相关文章

C++每日一练(7):爬山

题目描述 LeiQ最近参加了一个登山俱乐部&#xff0c;部长给他了一个n*m地图,地图上的每一个格子的值表示一个山的海拔高度&#xff0c;LeiQ现在在(x,y)表示在地图上的位置,他想要登上地图上最高的山&#xff0c;所以他想知道他爬上最高的山的山顶还需向上爬多少米。 例如: x\y…

基础算法--搜索与图论(1)

文章目录 DFS和BFSDFS搜索应用n-皇后问题 树和图的存储DFS遍历BFS遍历应用拓扑排序 DFS和BFS DFS&#xff0c;深度优先搜索&#xff0c; 数据结构&#xff1a;stack空间&#xff1a;Oh不具有最短性 BFS&#xff0c;宽度优先搜索 queueO2^h具有最短性&#xff08;当图的所有边权…

mysql获取数据列值(int和string)最大值

最近在开发项目的时候有这么个需求&#xff0c;我数据库里面存了很多升级包&#xff0c;升级包有列数据表示的是升级包的版本号&#xff0c;类型属于字符串&#xff0c;结构类似于V1.0.2.22这种&#xff0c;然后后台有个任务需要获取最新版本号的那条数据。最开始的时候我不知道…

【快速全面掌握 WAMPServer】09.如何在 WAMPServer 中安装 Composer

网管小贾 / sysadm.cc WAMPServer 的大名想必应该有不少人特别是新手小白们略有耳闻吧。 它是出自法国大神之手的一款 PHP 开发环境集成包&#xff0c;工作于 Windows 环境&#xff0c;类似于它这样的集成包在 Linux 平台上反正我是没找到&#xff0c;所以它应该算是对使用 Wi…

leaflet学习笔记-自定义Icon(四)

前言 leaflet的marker可以使用icon&#xff0c;所以这篇文章我们自定义一个icon&#xff0c;并在marker中使用&#xff0c;满足我的恶趣味 实例化Icon 首先准备一个你喜欢的图片&#xff0c;并将它添加到你的项目中&#xff0c;这里我找了一张本人的卡通图片 icon实例化代码&…

SpringBoot解决前后端分离跨域问题:状态码403拒绝访问

最近在写和同学一起做一个前后端分离的项目&#xff0c;今日开始对接口准备进行 登录注册 的时候发现前端在发起请求后&#xff0c;抓包发现后端返回了一个403的错误&#xff0c;解决了很久发现是【跨域问题】&#xff0c;第一次遇到&#xff0c;便作此记录✍ 异常描述 在后端…

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 最近更新的速度和频率大不如以前&#xff0c;主要原因还是自己有些懈怠了。学习是一个持续努力的过程&#xff0c;一旦中断&#xff0c;再想保持以往的状态可能要…

《数据库开发实践》之触发器【知识点罗列+例题演练】

一、什么是触发器&#xff1f; 1.概念&#xff1a; 简单来说触发器就是一种特殊的存储过程&#xff0c;在数据库服务器触发事件的时候会自动执行其SQL语句集。 2.构成四要素&#xff1a; &#xff08;1&#xff09;名称&#xff1a;要符合标识符命名规则 &#xff08;2&am…