析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
是清理工作而不是销毁,因为栈帧会随着程序的结束而销毁,是系统进行销毁,而析构函数是对动态开辟的空间里的资源进行清理。
在写栈时我们会在函数的最后对开辟的空间进行销毁,有时我们会忘记调用对开辟的空间进行销毁这个函数,所以我们可以使用析构函数,在main函数中不用调用,编译器自己进行调用析构函数进行资源的清理。
class Stack
{
public:
Stack(size_t capacity = 3)
{
cout << "Stack(size_t capacity = 3)" << endl;
_a = (int*)malloc(sizeof(int) * capacity);
if (nullptr == _a)
{
perror("malloc申请空间失败!!!");
}
_capacity = capacity;
_top = 0;
}
//析构函数
~Stack(){
free(_a);
_capacity=_top=0;
_a=nullprt;
}
private:
int* _a;
int _capacity;
int _top;
};
int main()
{
Stack st1;
MyQueue mq;
return 0;
}
1、构造顺序是按照语句的顺序进行构造,析构是按照构造的相反顺序进行析构。
2、类的析构函数调用一般按照构造函数调用的相反顺序进行调用,但是要注意static对象的存在,因为static改变了对象的生存作用域,需要等待程序结束时才会析构释放对象。
3、全局对象先于局部对象进行构造.
4、局部对象按照出现的顺序进行构造,无论是否为static。
5、析构的顺序按照构造的相反顺序析构,只需注意static改变对象的生存作用域之后,会放在局部对象之后进行析构。
C c;
int main()
{
A a;
B b;
static D d;
return 0;
}
上述程序中A,B,C,D析构函数调用顺序为B、A、D、C。