创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |