目录
析构函数和构造函数的区别
定义一个对象,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的析构函数。