🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
析构函数
概念
析构函数,与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
类似于我们之前经常用到的Deatroy()函数。
特性
析构函数是特殊的成员函数,其特征如下:
- 析构函数名是在类名前加上字符~
- 无参数无返回值类型
- 一个类只能有一个析构函数,若未显式定义,系统会自动生成默认的析构函数,注意,析构函数不能重载(因为没有参数)
- 对象生命周期结束时,C++编译系统自动调用析构函数。
typedef int DataType;
class Stack
{
public:
Stack(size_t capacity = 3)
{
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (_array == NULL)
{
perror("malloc fail");
return;
}
_capacity = capacity;
_size = 0;
}
void Push(DataType data)
{
_array[_size] = data;
_size++;
}
~Stack()
{
if (_array)
{
free(_array);
_array = NULL;
_capacity = 0;
_size = 0;
}
}
private:
int _capacity;
int _size;
DataType* _array;
};
void TestStack()
{
Stack s;
s.Push(1);
s.Push(2);
}
int main()
{
TestStack();
return 0;
}
5. 关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器自动生成的默认析构函数,对自定义类型调用它的析构函数。
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;
}
你看,这个特征是不是和构造函数特别像。
总结:
有资源需要显示清理,就需要写析构,如:stack,list
有两种场景不需要显示写析构,默认生成就可以。
1.没有资源需要清理,如Date
2. 内置类型成员没有资源需要清理,剩下的都是自定义类型成员,如MyQueue