【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25

news2024/11/16 21:56:28

目录

      • 前言
      • 初始化和清理的概念
      • 构造函数和析构函数的作用
        • 构造函数的作用
        • 析构函数的作用
      • 使用构造函数和析构函数的注意事项
      • 默认的构造函数和析构函数
      • 结束语

前言

在使用c语言开发的项目场景中,我们往往会遇到申请空间的需求,同时也肯定遇到过程序运行一段时间后会卡死(崩溃)的情况,分析下来大概率可能是内存堆空间容量不够用所导致,我们作为开发人员在设计时,往往在写了malloc申请函数之后,会容易忘记释放该申请的内存堆空间。但是上述问题,往往在c++中可以得到很好解决。

初始化和清理的概念

  1. 当对象产生时,必须初始化成员变量,当对象销毁前,必须清理对象
  2. 初始化用构造函数,清理用析构函数,这两个函数是编译器调用

构造函数和析构函数的作用

构造函数的作用

先看代码:

class Maker
{
public:
	Maker()
	{
		a = 10;
		cout << "构造函数" << endl;
	}
	
	~Maker()
	{
		cout << "析构函数" << endl;
	}
public:
	int a;
};

void test01()
{
	Maker m;
	int b = m.a;
	cout << b << endl;
}

好!按照老样子,接下来开始详细讲解每行代码的用处,以及为什么这样写!

void test01()
{
	Maker m;
	int b = m.a;
	cout << b << endl;
}
Maker m;

//首先实例化对象,并且该实例化对象为m。

int b = m.a;
cout << b << endl;

//将实例化对象m的成员变量a赋值给b,并且将b打印出来。

class Maker
{
public:
	Maker()
	{
		a = 10;
		cout << "构造函数" << endl;
	}
	
	~Maker()
	{
		cout << "析构函数" << endl;
	}
public:
	int a;
};
Maker()
	{
		a = 10;
		cout << "构造函数" << endl;
	}

//该函数即构造函数,构造函数的作用时初始化成员变量,并且是编译器自动调用的,即只要我们实例化对象之后,则编译器会自动调用构造函数进行初始化。
//构造函数的作用其实就类似与我们使用c语言开发时使用的malloc()函数
//在该构造函数中主要将10赋值给a。

~Maker()
{
	cout << "析构函数" << endl;
}

//该函数为析构函数,析构函数的作用其实就类似与我们使用c语言开发时使用的free()函数,所以在对象销毁前,编译器同样会自动调用析构函数。

接下来我们看下上述代码的执行结果如何?

在这里插入图片描述
由上图可知 ,确实会如同我们在前面讲述一样,系统编译器会自动调用构造函数和析构函数。

析构函数的作用

先看代码:

class Maker2
{
public:
	Maker2(const char *name,int age)
	{
		cout << "有参构造" << endl;
		pName = (char*)malloc(strlen(name) + 1);
		strcpy(pName, name);
		mAge = age;
	}

	void printMaker2()
	{
		cout << "name:" << pName << " age:" << mAge << endl;
	}
	~Maker2()
	{
		cout << "析构函数" << endl;
		if (pName != NULL)
		{
			free(pName);
			pName = NULL;
		}
	}
private:
	char *pName;
	int mAge;
};

void test02()
{
	Maker2 m2("翠花",18);
	m2.printMaker2();
}

好!按照老样子,接下来开始详细讲解每行代码的用处,以及为什么这样写!

void test02()
{
	Maker2 m2("翠花",18);
	m2.printMaker2();
}

//首先实例化对象,并且该实例化对象为m2
//并且这里调用的是有参构造函数的方法,将"翠花"18作为有参构造函数的形参传进去。
//调用类中的printMaker2函数将pNamemAge 打印出来。

Maker2(const char *name,int age)
{
	cout << "有参构造" << endl;
	pName = (char*)malloc(strlen(name) + 1);
	strcpy(pName, name);
	mAge = age;
}

//该函数为构造函数,并且使用的和上一个程序中构造形式不同,使用的是有参构造,其中有两个形参,分别是char类型的指针变量name和int类型的age。

pName = (char*)malloc(strlen(name) + 1);

//使用malloc函数在堆区中申请一段空间用来存放通过形参传入的name值。

strcpy(pName, name);

//将name指向的那段内存空间的内容复制到pName指向的那段内存空间中,即pName指向的那段内存空间中存放了真正传入该函数的name值。

mAge = age;

//简单的赋值操作。

~Maker2()
{
	cout << "析构函数" << endl;
	if (pName != NULL)
	{
		free(pName);
		pName = NULL;
	}
}

//该函数为析构函数,在该函数中首先判断在构造函数申请的堆区空间有没有申请成功,如果申请成功,则会调用free函数去释放掉该空间,并且将其指针指向NULL。

接下来我们看下上述代码的执行结果如何?

在这里插入图片描述
由上图可知 ,确实会如同我们在前面讲述一样,系统编译器会自动调用构造函数和析构函数。同时成功传入参数。

使用构造函数和析构函数的注意事项

  1. 构造函数和析构函数的权限必须是公有的
  2. 构造函数可以重载
  3. 构造函数没有返回值,不能用void,构造函数可以有参数,析构函数没有返回值,不能用void,没有参数
  4. 有对象产生必然会调用构造函数,有对象销毁必然会调用析构函数。有多少个对象产生就会调用多少次构造函数,有多少个对象销毁就会调用多少次析构函数

默认的构造函数和析构函数

先看代码:

class Maker
{
public:
	Maker()//默认的构造函数,函数体是空的
	{

	}
	~Maker()//默认的析构函数,函数体也是空
	{

	}
	//编译器默认提供默认的构造函数和析构函数
	void printfMaker()
	{
		a = 100;
		cout << "a=" << a << endl;
	}
private:
	int a;
};

//即使我们在类中没有声明构造函数或者析构函数,也没关系,编译器中已经设置了默认的构造函数和析构函数,只不过在这两个函数体中都是空的,不做任何处理。

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

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

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

相关文章

数字IC基础协议篇(1)——I2C协议

数字IC基础协议篇&#xff08;1&#xff09;——I2C协议 写在前面的话I2C协议应用框图I2C数据格式协议注意点 I2C读写EEPROM例程&#xff08;基于iverilog和gtkwave&#xff09;软件环境要求 项目框图总结 写在前面的话 协议介绍&#xff1a; I2C&#xff08;Inter-Integrated…

【CNN-FPGA开源项目解析】卷积层03--单格乘加运算单元PE 单窗口卷积块CU 模块

03–单格乘加运算单元PE & 单窗口卷积块CU 文章目录 03--单格乘加运算单元PE & 单窗口卷积块CU前言单格乘加运算单元PE代码模块结构时序逻辑分析对其上层模块CU的要求 单窗口卷积块CU代码逻辑分析 前言 ​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加…

Strtok函数切割字符串(附代码演示)

目录 1.认识Strtok函数 2.Strtok函数使用认识 3.Strtok使用代码示例 1.认识Strtok函数 C语言中的strtok函数是用来将字符串分割成若干个子串的函数。它的原型如上图所示 char *strtok(char *str, const char *delimiters);函数参数str为要被分割的字符串&#xff0c;参数del…

95 # express 二级路由的实现

上一节实现了兼容老的路由写法&#xff0c;这一节来实现二级路由 二级路由实现核心&#xff1a; 进入中间件后&#xff0c;让对应的路由系统去进行匹配操作中间件进去匹配需要删除 path&#xff0c;存起来出去时在加上 示意图&#xff1a; 代码实现如下&#xff1a; rout…

护理不良事件成因分析及预防措施,你知道哪些

不良事件上报管理系统源码 护理不良事件主要成因分析 1&#xff0e;查对制度不严&#xff1a;因不认真执行各种查对制度&#xff0c;而在实际护理工作中出现的不良事件仍占较高比例。具体表现在用药查对不严&#xff0c;只喊床号&#xff0c;不喊姓名&#xff0c;致使给患者输错…

【算法练习Day5】有效的字母异位词 两个数组的交集快乐数两数之和

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 有效的字母异位词两个数…

基于springboot+vue的青年公寓服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

K8SYaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例&#xff08;1&#xff09;相关标签介绍&#xff08;2&#xff09;Deployment类型编写nginx服务&#xff08;3&#xff09;k8s集群中的port介绍&#x…

Unity 内存性能分析器 (Memory Profiler)

一、 安装 安装有两种方式一&#xff1a; add package : com.unity.memoryprofiler方式二&#xff1a; From Packages : Unity Registry 搜索 Memory Profiler 二、 使用 打开&#xff1a;Windows - > Analysis - > Memory Profiler 打开MemoryProfiler界面&#xff0…

深入学习JVM(Java虚拟机)

目录 一.JDK、JRE、JVM的关系 1.1JDK(Java SE Development Kit) 1.2JRE( Java Runtime Environment) 1.3JVM(Java Virtual Machine) 1.4JDK、JRE、JVM的区别与联系 二.Class的生命周期 2.1加载 2.1.1 类加载器 2.1.2类加载机制 2.1.3双亲委派 2.2链接 2.2.1验证 2…

antd-vue 级联选择器默认值不生效解决方案

一、业务场景&#xff1a; 最近在使用Vue框架和antd-vue组件库的时候&#xff0c;发现在做编辑回显时** 级联选择器** 组件的默认值不生效。为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、bug信息&#xff1a; 三、问题原因&#xff1a; 确定不了唯一的值&a…

GEE:根据影像最小值和最大值自适应可视化参数设置

作者:CSDN @ _养乐多_ 本文将介绍根据影像最小值和最大值,自适应的设置影像可视化参数设置。 文章目录 一、核心函数二、代码示例三、代码链接一、核心函数 //计算影像的最小值和最大值,为了可视化 var imageMin = (image.reduceRegion({reduc

使用CRM管理销售渠道的 5 个重要优势

销售渠道的管理是创造积极客户体验的关键因素&#xff0c;对企业来说非常重要。大多数情况下&#xff0c;客户关系管理&#xff08;CRM&#xff09;系统可用于高效的销售渠道管理。那么&#xff0c;利用CRM系统管理销售渠道有哪些优势呢&#xff1f; 1) 有效的线索管理 销售渠…

CSS实现鼠标悬停图片上升显示

文章目录 前言一、实现效果二、实现思路 前言 当我们想在图片上面放置一些文字内容时&#xff0c;发现不管怎么放置&#xff0c;要么就是图片影响到文字的观感&#xff0c;要么就是文字挡住图片的细节&#xff0c;那么怎么可以既看到图片的细节又可以看到对图片的文字描述呢&a…

基于R语言分位数回归丨线性回归假设与分位数函数、线性分位数回归 、贝叶斯分位数回归、超越线性分位数回归等

目录 专题一 线性回归假设与分位数函数讲解 专题二 线性分位数回归 【代码实践】 专题三 贝叶斯分位数回归【代码实践】 专题四 超越线性分位数回归&#xff08;一&#xff09;【代码实践】 专题五 超越线性分位数回归&#xff08;二&#xff09;【代码实践】 更多应用 回…

怎样的外发文件管理办法 能够避免数据外发泄露?

在日常办公中&#xff0c;重要文件保密管理可谓“老生常谈”。但我们往往容易忽视&#xff0c;文件保密管理并非个体所能独立完成&#xff0c;在整个文件运转过程中&#xff0c;存在多名经手人&#xff0c;一人发生疏忽&#xff0c;则整个安全屏障都会被打破。 因此&#xff0c…

膝盖前交叉韧带断裂

等级、治愈&#xff08;几乎不可能&#xff0c;除非康复阶段做得非常到位。手术后可恢复到90%&#xff09;&#xff0c;饮食&#xff0c;康复训练&#xff08;完全康复&#xff09;、心理作用 赔偿&#xff1a;工商&#xff08;分出两份&#xff09;&#xff0c;伤残证&#x…

Spring Boot 如何实现单点登录(SSO)

当今的应用程序越来越多地采用了微服务架构&#xff0c;这就引出了一个重要的问题&#xff1a;如何实现单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;来确保用户在多个微服务之间无需重复登录。Spring Boot是一个流行的Java框架&#xff0c;它提供了一些…

旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著作想象和世界一样宽广

旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著作想象和世界一样宽广

AB试验(四)基于规范流程的一个案例分析

AB试验&#xff08;四&#xff09;基于规范流程的一个案例分析 确定目标和假设 业务场景&#xff1a;某音乐APP&#xff0c;通过历史数据发现一些便利功能往往有着较高的留存和续订。但是这些便利功能的使用率并不高。调研发现&#xff0c;由于APP崇尚简洁设计&#xff0c;因…