C++中析构函数相关的知识点

举报
努力变强的小C 发表于 2022/09/27 21:29:46 2022/09/27
【摘要】 C++中析构函数相关的知识点

目录


析构函数和构造函数的区别 

析构函数的例子

代码一:

代码二:

小结

 析构函数调用的条件

析构函数和构造函数的区别 

定义一个对象,c++自动调用构造函数建立该对象并进行初始化,那么当一个对象的生命周期结束时,c++会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数叫做析构函数

析构函数和类名相同,但在前面要加~这个符号析构函数是没有函数返回类型的,与构造函数在这方面是一样的。但析构函数不带任何参数。一个类只有一个析构函数,这是和构造函数不一样的,

因为在类中构造函数时可以重载的,但时析构函数是只有一个,对象注销时,系统自动调用析构函数。若类说明中没有给出析构函数,则c++会给出一个缺省的析构函数。


析构函数的例子

观察代码一和代码二输出结果的异同:

代码一:

#include <iostream>
using namespace std; 
class Score {
	private:
		int age, score;
	public:
		Score(int a, int s);	//创建一个自定义的构造函数
		Score();	//创建构造函数的重载
		~Score();	//首先声明一个析构函数
};
Score::Score(int a, int s) {
	cout << "我是构造函数,现在已执行……" << endl;
	age = a;
	score = s;
}
Score::Score() {
	cout << "我是构造函数的重载……" << endl;
}
Score::~Score() {
	cout << "对象注销,现在自动执行析构函数了……" << endl;
}
int main() {
	Score score1;
	//Score score2(18, 100);
}

 输出结果:

 

​​代码二:

#include <iostream>
using namespace std; 
class Score {
	private:
		int age, score;
	public:
		Score(int a, int s);	//创建一个自定义的构造函数
		Score();	//创建构造函数的重载
		~Score();	//首先声明一个析构函数
};
Score::Score(int a, int s) {
	cout << "我是构造函数,现在已执行……" << endl;
	age = a;
	score = s;
}
Score::Score() {
	cout << "我是构造函数的重载……" << endl;
}
Score::~Score() {
	cout << "对象注销,现在自动执行析构函数了……" << endl;
}
int main() {
	//Score score1;
	Score score2(18, 100);
}

 输出结果:

小结

在上面我们定义了两个构造函数,所以我们定义的对象会根据对象传递的参数来自行选择构造函数,但是析构函数是总会在对象注销的时候执行,并且由于析构函数是没有参数,也没有返回值,所以构造函数是不能够重载的,因此在一个类中只能够有一个析构函数,并且如果我们不自定义析构函数的话,程序就会自动调用默认的析构函数 

 析构函数调用的条件

1、生命周期:对象生命周期结束,会调用析构函数。

2.delete:若一个对象是使用new运算符动态创建的,调用delete释放它时,会删除指针类对象。

3.包含关系:对象1是对象2的成员,对象2的析构函数被调用时,对象1的析构函数也被调用。

4.继承关系:当Father是Son的父类,调用Son的析构函数,会调用Father的析构函数。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。