析构函数与构造函数就是功能截然相反的两个函数了,析构函数就是将对象内部的资源进行清理(如malloc开辟的等)
值得注意的是 -- 很多人误以为析构函数是销毁对象 ---对象的销毁工作是由编译器完成的
我们现在说说析构函数的有那些特性 -----1.还是重析构函数的名
1.析构的函数名是在类名前加~ ——如下代码
class Data
{
public:
//构造函数
Data(int year=2022, int month = 2, int day = 5)
{
_year = year;
_month = month;
_day = day;
}
//析构函数
~Data()
{
cout << "~Data()" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Data D1(2023, 1, 9);
return 0;
}
2.无参数无返回值(构造函数是无返回值)
3.对象声明周期结束是,C++编译系统自动调用析构函数
class Stack
{
private:
int* _a;
size_t _top;
size_t _capacity;
public:
Stack(int capacity = 4)
{
_a = (int*)malloc(sizeof(int) * capacity);
if (_a == nullptr)
{
cout << "malloc fail" << endl;
exit(-1);
}
_capacity = capacity;
_top = 0;
}
//析构函数
~Stack()
{
free(_a);
_a = nullptr;
_top = _capacity = 0;
}
};
int main()
{
//自动调用构造函数
Stack s1;
Stack s2(20);
return 0;
}
用上面代码验证第三点 --- 在return 0 处按f11分析跳进了`~Stack析构函数
并且一旦对象声明周期结束 -- 直接将s1和s2的内部资源进行清理
出前
出后
4.一个类只有析构函数,若显示未定义,相同会自动生成默认的析构函数
只有一个析构函数是因为析构函数不能重构(必须无参)
如果我们不写析构函数,编译器会自动默认生成析构函数 和 构造函数类似
对于内置成员类型不做处理
对于自定义类型会去调用它的析构函数
那么编译器默认生成的析构函数和构造函数就没有用了嘛 --> 其实是有很大作用的 (如在用两个栈实现队列)
class Stack
{
private:
int* _a;
size_t _top;
size_t _capacity;
public:
Stack(int capacity = 4)
{
_a = (int*)malloc(sizeof(int) * capacity);
if (_a == nullptr)
{
cout << "malloc fail" << endl;
exit(-1);
}
_capacity = capacity;
_top = 0;
}
};
class MyQueue {
public:
void push(int x) {
}
int pop() {
}
int peek() {
}
bool empty() {
}
private:
//自定义类型 --- 自动调用他们的构造函数(进行初始化)
//对象内资源销毁时自动调用析构函数
Stack Push1;
Stack Pop;
};
int main()
{
//我们没有在MyQueue定义构造函数和析构函数
//我们可以直接使用默认的析构函数和默认的构造函数对Push1和Pop进行清理和初始化
MyQueue q1;
return 0;
}
这样在我们实现两个栈时,不需要对Push栈和[Pop栈进行分别的初始化和销毁了--更方便了
这里就是我们默认析构函数和构造函数作用一个最直接的体现