目录
1.概念
2.特性
1.概念
与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作
2.特性
析构函数是特殊的成员函数,其特征如下:
- 析构函数名是在类名前加上字符~。
- 无参数无返回值类型。
- 一个类只能有一个析构函数。若未显示定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。
- 对象生命周期结束时,C++编译系统自动调用析构函数
typedef int DataType;
class Stack
{
public:Stack(int capacity = 3){_a = (DataType*)malloc(sizeof(DataType) * capacity);if (_a == nullptr){perror("malloc::fail");return;}_capacity = capacity;_size = 0;}void Push(DataType data){//Checkcapacity();_a[_size--] = data;_size++;}//···~Stack(){if (_a){free(_a);_a = nullptr;_capacity = _size = 0;}}private:DataType* _a;int _capacity;int _size;
};int main()
{Stack s;s.Push(1);s.Push(2);
}
5.编译器生成的默认析构函数,对自定义类型成员调用它的析构函数。
class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};class Date
{
private://基本类型(内置类型)int _year = 2024;int _month = 12;int _day = 15;//自定义类型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类生成一个默认
// 的析构函数,而Date没有显示提供,则编译器会给Date类生成一个默认的析构函数,目前是在其
// 内部调用Time类的析构函数,而Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁
//main函数中并没有并没有直接调用Time类析构函数,而是显示调用编译器Date类生成的默认析构函数//注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数
什么情况下,我们需要用析构函数?
1.一般情况下,有动态申请资源,就要显示写析构函数释放资源2.没有动态申请的资源,不需要写析构
3.需要释放资源的成员都是自定义类型,不需要析构