【C/C++】构造函数与析构函数

news2024/11/20 7:20:40

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、构造函数
  • 二、析构函数
  • 结语

在理解【类和对象的基本概念】后,下面介绍两个在面向对象编程中用于的特殊成员函数——构造函数析构函数

下面创建一个简单的CPeople类用作本文的展开:

#include <iostream>
#include <string>
using namespace std;
class CPeople
{
public:
	string m_strName;
	int m_nAge;
	bool m_bSex;
	string m_strNote;
	void show()
	{
		cout << "姓名: " << m_strName << " 年龄: " << m_nAge << " 性别: " << m_bSex << endl;
		cout << "简介: " << m_strNote << endl;
	}
	void doing()
	{
		cout << "-->" << m_strName << "正在学习C++" << endl;
	}
};
int main()
{
	CPeople peo;
	peo.m_nAge = 19;
	peo.m_strName = "天喜Studio";
	peo.m_bSex = 1;
	peo.m_strNote = "CSDN上分享知识";
	peo.show();
	peo.doing();
	return 0;
}

通常在定义变量时要初始化,而在定义类对象时,成员属性并没有得到初始化,如何对类成员进行初始化呢?

C++对此提供了一种特殊的成员函数——析构函数

一、构造函数

构造函数: 其作用是用来初始化类成员属性。

空类中存在一个默认的无参数的构造,函数名为当前类名无返回值(并不是返回空void,而是没有返回值!)

书写格式如下:

class CTest		//类名
{
	CTest()		//构造函数名与类名相同,默认无参数
	{
		//默认无参构造
	} 
};

构造函数并不需要我们手动调用,在定义对象的时候会自动调用,默认的无参构造是编译器提供的

函数体代码为空,所以在定义对象时虽然调用了,但并没有这正给成员初始化

所以需要我们手动重构构造函数,进行初始化的成员属性写在构造函数体内就可以在程序执行时被初始化

在这里插入图片描述

CPeople类中添加构造函数:

CPeople()
{
	m_strName = "天喜Studio";
	m_nAge = 19;
	m_bSex = 1;
	m_strNote = "CSDN上分享知识";
}

在这里插入图片描述

可以使用不同的参数列表创建多个构造函数,他们构成函数重载,重构的构造函数可以指定参数来符合我们需要的初始化过程。

	CPeople()
	{
		m_strName = "天喜Studio";
		m_nAge = 19;
		m_bSex = 1;
		m_strNote = "CSDN上分享知识";
	}
	CPeople(int id)
	{
		m_strName = "CoCo";
		m_nAge = 20;
		m_bSex = 0;
		m_strNote = "这是一个带参构造函数例子";
	}

在主函数中,如果要调用带参的构造函数,在定义对象时指定,就会根据参数的类型数量自动匹配对应的构造

int main()
{
	CPeople peo;
	peo.show();
	peo.doing();

	CPeople peo2(2);
	peo2.show();
	peo2.doing();
	return 0;
}

在这里插入图片描述

只要重构了任何的构造函数,编译器将不会再提供那个默认的无参构造了
定义多个对象可能会执行不同的构造,但一个对象最终只能执行其中一个构造

如果在类中使用new在堆区给类中的成员创建了额外的内存空间,应该在何时进行delete呢?

char* node = new char[20] {'a'};

下面介绍用来回收类中成员申请额外空间的特殊成员函数——析构函数

二、析构函数

析构函数:与构造函数相对应的析构函数,其作用是回收类中成员申请的额外空间而不是对象本身!

空类中存在一个默认的析构函数,函数名为~类名,无返回值,无参数。

书写格式如下:

class CTest		//类名
{
	~CTest()	//构造函数名与类名相同,无参数!
	{ 
		//默认析构函数
	} 
};

析构函数在对象的生命周期结束的时候,自动调用,编译器提供的默认析构函数函数体代码也为空我们可以手动重构,一旦重构,编译器就不会再提供那个默认析构了,与构造不同的是析构函数只允许存在一个!

CPeople类中添加析构函数:

	~CPeople()
	{
		if (node)
		{
			delete[]node;
			node = nullptr;
		}
	}

注:析构在真正回收对象内存空间之前去调用,额外的空间回收完后,才真正回收对象内存空间。


结语

构造函数和析构函数确保了对象的正确初始化和清理,能够提高程序的可靠性和效率(✿◠‿◠)

(在后面文章提到静态成员变量时再介绍构造函数的初始化参数列表

在这里插入图片描述

本文完整代码:

#include <iostream>
#include <string>
using namespace std;
class CPeople
{
public:
	string m_strName;
	int m_nAge;
	bool m_bSex;
	string m_strNote;
	char* node;
	void show()
	{
		cout << "姓名: " << m_strName << " 年龄: " << m_nAge << " 性别: " << m_bSex << endl;

		cout << "简介: " << m_strNote << endl;
	}
	void doing()
	{
		cout << "-->" << m_strName << "正在学习C++" << endl;
	}
	CPeople()
	{
		m_strName = "天喜Studio";
		m_nAge = 19;
		m_bSex = 1;
		m_strNote = "CSDN上分享知识";
	}
	CPeople(int id)
	{
		m_strName = "CoCo";
		m_nAge = 20;
		m_bSex = 0;
		m_strNote = "这是一个带参构造函数例子";
		node = new char[20]{'a'};
	}
	~CPeople()
	{
		if (node)
		{
			delete[]node;
			node = nullptr;
		}
	}
};
int main()
{
	CPeople peo;
	peo.show();
	peo.doing();

	CPeople peo2(2);
	peo2.show();
	peo2.doing();
	return 0;
}

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

【话题研究】重塑活力:顺应消费需求变化,PC市场需创新、技术驱动和营销策略更优解

话题研究&#xff1a;大众还需要PC吗&#xff1f;PC市场如何走出寒冬&#xff1f; 1️⃣ PC市场进入寒冬的深层原因2️⃣ PC仍具有独特的优势和不可替代性3️⃣ 创新、定制化和用户体验4️⃣ AI、VR时代带来的新出路 市场调研机构 Canalys数据显示&#xff0c;今年一季度&#…

elastic-job-ui在使用druid作为数据库连接池时作业维度报错

问题说明&#xff1a; 我们项目中使用到了elastic-job&#xff0c;然后自己封装了个sdk&#xff0c;方便使用&#xff0c;里面的数据源配置是常用的druidmysql的组合&#xff0c;在操作中&#xff0c;发现elastic-job-ui可视化控制台会报错无法使用。 深究其原因是因为&#…

返回值封装,异常统一处理优雅解决接口所有问题

在项目整体架构设计的时候&#xff0c;我们经常需要做以下工作&#xff1a; 返回值的统一封装处理&#xff0c;因为只有规范好统一的返回值格式&#xff0c;才能不会给接口使用者带来疑惑和方便前端对接口的统一处理。对异常码进行严格规定&#xff0c;什么错误返回什么码制&a…

ShardingSphere-JDBC 5.1.1 分库分表

分库分表解决的问题 mysql的扩展 mysql并不能完全利用高性能服务器的硬件&#xff0c;当cpu超过24个&#xff0c;内存超过128G时&#xff0c;mysql性能处于平缓&#xff0c;不在上升&#xff0c;所以在一个性能强大的服务器上运行多个实例&#xff0c;才更合理 mysql常见的扩…

java.sql.SQLException: No value specified for parameter 6

异常 java.sql.SQLException: No value specified for parameter 6 原因 sql中定义了6个参数&#xff0c;只传了5个参数

设计模式—“领域规则”

在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。 典型模式有:Interpreter Interpreter 动机 在软件构建过程中,如果某一个特定领域的问题比较复杂,类似的结构不断重复出现,…

.NET Microsoft.Extensions.Logging + NLog 记录日志到文件

最近想了解下面向对象开发&#xff0c;选择C# 语言 以及NET6.0 日志是开发中最常用的功能&#xff0c;本文记录下其中日志使用方法&#xff0c;理解不全的地方后续再学习补充 环境 Ubuntu 22.04.2 LTSdotnet 6.0.411 准备工作 # https://learn.microsoft.com/zh-cn/dotnet/c…

2023.6.21AgentGPT部署

在云服务器上使用Docker部署AgentGPT 需要自行提供OpenAI的API Key https://platform.openai.com/account/api-keys 需要自行提供云服务器或者虚拟机 需要自行解决网络的问题&#xff0c;本文中使用的是小喵咪解决网络的问题【需要订阅地址】 文章目录 在云服务器上使用Docker…

数据在内存中的存储-浮点型

常见的浮点型数据&#xff1a;单精度浮点型float、双精度浮点型double,还有long double类型。 浮点数表示的范围&#xff1a;float.h中定义 目录 一、浮点数存储的例子 二、浮点数存储规则 三、例题解释 一、浮点数存储的例子 #include<stdio.h> int main() {int …

王道操作系统学习笔记(1)——操作系统基本概念

前言 本文介绍了操作系统的基本概念&#xff0c;文章中的内容来自B站王道考研操作系统课程&#xff0c;想要完整学习的可以到B站官方看完整版。 一&#xff1a;操作系统基本概念 1.1.1&#xff1a;基本概念和功能 操作系统&#xff1a;系统资源的管理者&#xff08;处理机管…

QGIS 插件获取哨兵数据

基于 Sentinel Hub QGIS 插件&#xff0c;该插件允许您直接在 QGIS中配置和利用Sentinel Hub 服务的强大功能。该插件可视化 Sentinel 数据&#xff0c;可用于正在处理的任何其他项目中。 来自&#xff1a;GIS数据栈整理&#xff1a;GIS数据栈 一起来看看如何在QGIS中使用吧&am…

6张图表 + 1个案例 带你入门tcpdump的使用和原理

一、tcpdump简介 tcpdump是什么&#xff1f; 来看看 tcpdump官网怎么说&#xff1a;This is the home web site of tcpdump, a powerful command-line packet analyzer; and libpcap, a portable C/C library for network traffic capture. 不妨来看看chatGPT插件怎么说&…

【自我提升】openCV基本操作

写在前面&#xff1a;本篇博客主要是记录opnecv的基本操作&#xff0c;不记录安装等步骤。方便回顾和查找方法。 一、图像的IO操作&#xff0c;读取和保存方法 读取图像 在OpenCV中&#xff0c;读取图像的函数是imread()。该函数可以从指定的文件中加载图像&#xff0c;返回值…

Qt6.2教程——5.QT常用控件QLabel

1. QLabel简介 QLabel是Qt库中一个非常基础且重要的类。它主要用于在图形用户界面(GUI)中展示文本或图片。最常见的用法就是在窗口上显示一段文字或者标签&#xff0c;比如“用户名”&#xff0c;“密码”等等。QLabel继承自QFrame&#xff0c;因此它也可以具有框架。它能处理…

0005Java程序设计-jsp企业财务管理系统设计与实现

企业财务管理系统 摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用&#xff0c;企业发展速度在不断加快&#xff0c;在这种市场竞争冲击下企业财务管理系统必须优先发展&#xff0c;这样才能保证在竞争中处于优势地位。对此企业必须实现财务管…

安卓平板修改和平精英90帧、120帧超广角,2k/4k分辨率(无需root!!!)

前言&#xff1a;今天我们将探讨如何在安卓平板上修改和平精英超广角以及高帧率画质效果。 1、首先&#xff0c;我们要知道平板改超广角的好处是什么&#xff1f;我们都知道平板相比于手机显示宽度是要更大的&#xff0c;如果平板再改个超广角效果&#xff0c;甚至连脚都可以看…

避免滥用Qt信号与槽——改进taskBus 平台以吞吐20M IQ采样带宽

taskBus 软件无线电平台是一款依靠 stdin-stdout进行数据吞吐的教学平台。在平台创建之初&#xff0c;主要使用 RTL-SDR进行简单的窄带接收应用&#xff0c;并没有考虑采样率超过1.8M的情况。引入 USRP B210/B205mini后&#xff0c;采样率瞬间提高到2M以上&#xff0c;此时&…

springboot+vue项目中如何利用七牛云实现头像的上传

做了个前后端分离的项目&#xff0c;对于用户的头像修改一直不是很满意&#xff0c; 于是用了Vant4的组件库改成了文件点击上传&#xff0c;先是打算存到本地&#xff0c;了解到七牛云的方便后&#xff08;主要是免费&#xff09;&#xff0c;决定改成七牛云存储图片&#xff…

ElasticSearch的安装和访问

ElasticSearch的安装 前言: 本次下载是在Windows系统进行操作,版本为7.6.1,因为下周最新版本的8.1.2有问题 ElasticSearch基于Java开发,JDK最低1.8版本 ElasticSearch的版本要和之后引入的Maven的Jar包版本对应 1 下载ElasticSearch 官网:https://www.elastic.co/cn/ 产品…