析构函数同样作为struct 重要的特性之一
她和构造函数概念差不多
构造函数是对象创建时自动调用的
析构函数则是对象销毁时自动调用的
刚好是一对 对象生命周期 开始时 和 结束时
如
struct A
{
A(){} // 无参构造函数
~A(){} // 这个就是析构函数
}
析构函数特性:
一:
它是对象销毁时进行自动调用的 一般是拿来做清理工作的
二:
析构函数一个类中只能有一个(无重载)
三:
析构函数无参!无参! 这是与构造函数的不同
四:
析构函数可以是 虚析构函数 (加virtual 关键字)
五:
与构造函数一样 在析构或构造函数中
无多态性 (父指针调用虚函数 不会从虚函数表中去调用子类的同名虚函数)
问,我们为何需要析构函数?
好问题,我以前也不知道为什么需要析构函数
后面我发现大概是 我学习路径的问题
如果先学了new 和 delete 我应该就能理解了
所以现在 说说new 和 delete 关键字
(说是关键字 我到感觉更像函数)
new 和 c语言中的 malloc 函数差不多
在堆空间开辟空间
delete 和 c语言中的 free 函数差不多
归还之前在堆空间中开辟的空间
语法规则
new 类型名;//这里我感觉其实应该放调用类型的构造函数
注意 new 实例类型变量时 返回的是堆空间中的地址值 需要使用指针存储
delete 地址值;
注意
使用 new 返回从堆空间中 出来的地址值
我们一定是需要归还的 使用delete
否则在遗失该地址值后 我们就会导致内存泄漏
如
struct B
{
int a;
B(int b):a(b){}
~B(){}
}
struct C
{
B* pB;
C()
{
pB = new B();//error 使用了B 的无参构造函数 但是B中没有 无参构造函数
pB = new B(100);//ok 使用了B 的有参函数
}
~C()
{
delete pB;//归还堆空间 销毁该B类型的对象
既然是销毁B类型对象 当然
也会自动调用B类型的析构函数
}
}
int main()
{
C cobj;//调用无参构造 创建栈对象
return 0;// 函数结束 销毁函数栈中的栈变量 cobj 被销毁
}
上述 我们在C类型的析构函数中
delete 掉 C类型构造函数中的 new 出来的地址值
有构造与析构的特性 达到了 自动归还堆空间的概念
而这便是析构函数存在的意义 主要就是做清理工作
现有个问题,析构函数既然是函数 通过实例对象主动调用析构函数 这个实例对象会被销毁吗?
自己去试验试验
如
//main 函数中
C cobj;//调用无参构造 创建栈对象
cobj.~C();//主动调用析构
&cobj;
return 0;// 函数结束 销毁函数栈中的栈变量 cobj 被销毁