🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
析构函数
概念
析构函数,与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
类似于我们之前经常用到的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