c++之说_9_5|自定义类型 struct 析构函数

析构函数同样作为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 被销毁  

你可能感兴趣的:(C++,c++,开发语言)