析构函数的概念
析构函数不是完成对对象本身的销毁,局部对象销毁的工作是由编译器完成的。
而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
析构函数的特性
1.析构函数名是在类名前面加~;
2.无参数无返回值类型;
3.一个类只能有一个析构函数。如果没有显式定义,系统会自动生成默认的析构函数。
4.析构函数不能重载;
5.对象生命周期结束时,C++编译器系统就会自动调用析构函数。
生命周期结束就是出了函数作用域的时候。
析构与Destroy的功能相似,不是释放对象本身,而是释放对象所指向的动态开辟的资源。
日期类就没有必要写析构函数,因为都是内置类型的.
关于编译器自动生成的析构函数
class Time
{
public:
~Time()
{
cout << "~Time()" << endl;
}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
private:
// 基本类型(内置类型)
int _year = 1970;
int _month = 1;
int _day = 1;
// 自定义类型
Time _t;
};
int main()
{
Date d;
return 0; }
// 程序运行结束后输出:~Time()
// 在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数?
// 因为:main方法中创建了Date对象d,而d中包含4个成员变量,其中_year, _month, _day三个是内置类型成员,销毁时不需要资源清理,最后系统直接将其内存回收即可;
//而_t是Time类对象,所以在d销毁时,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的析构函数。
//但是:main函数中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数,目的是在其内部调用Time类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁
//main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数
// 注意:创建哪个类的对象则调用该类的析构函数,销毁哪个类的对象则调用该类的析构函数