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

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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;
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值