Hello,友友们,我是你们的好朋友一一,今天一一想给大家分享一点关于构造函数和析构函数的知识点,欢迎大家批评指正!
1.初始化和清理
大家在购买一台电脑或者手机,或者其他的产品,这些产品都有一个初始设置,也就是这些产品对被创建的时候会有一个基础属性值。那么随着我们使用手机和电脑的时间越来越久,那么电脑和手机会慢慢被我们手动创建很多文件数据,某一天我们不用手机或电脑了,那么我们应该将电脑或手机中我们增加的数据删除掉,保护自己的信息数据。
从这样的过程中,我们体会一下,所有的事物在起初的时候都应该有个初始状态,当这个事物完成其使命时,应该及时清除外界作用于上面的一些信息数据。
那么在我们c++中具体来说,当我们创建对象的时候,这个对象应该有一个初始状态,当对象销毁之前应该销毁自己创建的一些数据。
对象的初始化和清理也是两个非常重要的安全问题,一个对象或者变量没有初始时,对其使用后果是未知,同样的使用完一个变量,没有及时清理,也会造成一定的安全问题。c++为了给我们提供这种问题的解决方案,构造函数和析构函数,这两个函数将会被编译器自动调用,完成对象初始化和对象清理工作。
无论你是否喜欢,对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化 *** 作和清理 *** 作,编译器也会给你增加默认的 *** 作,只是这个默认初始化 *** 作不会做任何事,所以编写类就应该顺便提供初始化函数。
为什么初始化 *** 作是自动调用而不是手动调用?既然是必须 *** 作,那么自动调用会更好,如果靠程序员自觉,那么就会存在遗漏初始化的情况出现。
2.构造函数和析构函数构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
析构函数主要用于对象销毁前系统自动调用,执行一些清理工作。
//构造函数: 没有返回值,不用写void,函数名与类名相同,可以有参数,可发生重载,由编译器自动调用,不用手动调用。
//析构函数: 没有返回值,不用写void,函数名与类名相同,函数名前面加~,不可以有参数,不可发生重载,由编译器自动调用,不用手动调用。
#include
using namespace std;
//基本用法
class Person
{
Person()
{
cout << "构造函数调用" << endl;
}
~Person()
{
cout << "析构函数调用" << endl;
}
};
void test(){};
int main()
{
test();
return 0;
}
//举例
class Person
{
public:
Person()
{
cout << "构造函数调用" << endl;
pname = (char*)malloc(sizeof("John"));
strcpy(pname, "John");
mtall = 188;
mmoney = 200;
}
~Person()
{
cout << "析构函数调用" << endl;
if (pname != NULL)
{
free(pname);
pname = NULL;
}
}
public:
char* pname;
int mtall;
int mmoney;
};
void test()
{
Person P;
cout << P.pname << P.mtall <
3.构造函数的分类及调用
- 按参数类型:分为无参构造函数和有参构造函数
- 按类型分类:普通构造函数和拷贝构造函数(复制构造函数)
4.构造函数调用规则class Person { public: Person() //无参构造函数 { cout << "无参构造函数"<
默认情况下,c++编译器至少为我们写的类增加3个函数
默认构造函数(无参,函数体为空)
默认析构函数(无参,函数体为空)
默认拷贝构造函数,对类中非静态成员属性简单值拷贝
如果用户定义拷贝构造函数,c++不会再提供任何默认构造函数
如果用户定义了普通构造(非拷贝),c++不在提供默认无参构造,但是会提供默认拷贝构造
今天的分享到此结束,喜欢的朋友可以点赞加关注呀!(比心比心🫰)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)