创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作(例如回收创建对象时消耗的各种资源),这个函数被称为析构函数。

析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要用户调用,而是在销毁对象时自动执行。与构造函数不同的是,析构函数的名字是在类名前面加一个”~“符号。

注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,那么编译器会自动生成。

析构函数举例:

 #include <iostream>
using namespace std;
classStudent{
private:
char *name;
int age;
float score;
public:
//构造函数
Student(char *, int, float);
//析构函数
~Student();
//普通成员函数
void say();
};
Student::Student(char *name1, int age1, float score1):name(name1), age(age1), score(score1){}
Student::~Student(){
cout<<name<<"再见"<<endl;
}
void Student::say(){
cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
}
int main(){
Studentstu1("小明", , 90.5f);
stu1.say();
Studentstu2("李磊", , );
stu2.say();
Studentstu3("王爽", , 80.5f);
stu3.say();
cout<<"main 函数即将运行结束"<<endl;
return ;
}

运行结果:
小明的年龄是 15,成绩是 90.5
李磊的年龄是 16,成绩是 95
王爽的年龄是 16,成绩是 80.5
main 函数即将运行结束
王爽再见
李磊再见
小明再见

可以看出,析构函数在 main 函数运行结束前被执行,并且调用顺序和构造函数正好相反,为了方便记忆,我们可以将之理解为一个栈,先入后出。

析构函数在对象被销毁前执行;要知道析构函数什么时候被调用,就要先知道对象什么时候被销毁。

对象可以认为是通过类这种数据类型定义的变量,它的很多特性和普通变量是一样的,例如作用域、生命周期等。由此可以推断,对象这种变量的销毁时机和普通变量是一样的。

总结起来,有下面几种情况:
1) 如果在一个函数中定义了一个对象(auto 局部变量),当这个函数运行结束时,对象就会被销毁,在对象被销毁前自动执行析构函数。

2) static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。

3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数。

4) 如果用 new 运算符动态地建立了一个对象,当用 delete 运算符释放该对象时,先调用该对象的析构函数。

注意:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以分配给新对象使用。


最新文章

  1. web前端基础知识-(四)DOM
  2. jquery数组删除指定元素的方法:grep()
  3. Eclipse 启动Tomcat 超时报错的解决方案
  4. cocos2d-x 3.1.1 学习笔记[3]Action 动作
  5. html5 之 canvas 相关知识(二)API-fillStyle
  6. 推荐5 款WordPress主题后台选项开发框架
  7. [转] Console命令详解,让调试js代码变得更简单
  8. STL之优先级队列priority_queue
  9. java 集合中将元素倒序排列
  10. cocos2d3.8.1 使用prebuild提升发布android速度
  11. 日历上添加活动通知(Asp.net)
  12. Java中Properties类
  13. webpack学习笔记(五)
  14. 【渗透攻防】深入了解Windows
  15. Confluence 6 连接到 Jira 用户管理的建议
  16. Vijos / 题库 / 输油管道问题
  17. Docker中images中none的镜像删除
  18. 显卡 GPU 关系
  19. HBuilder实现WiFi调试Android
  20. POJ - 1017 贪心训练

热门文章

  1. 深入理解java虚拟机(十二) Java 语法糖背后的真相
  2. python之文件操作总结
  3. TSQL--NESTED LOOPS JOIN
  4. 在 CentOS 上运行 ZKEACMS
  5. NVIDIA GTC照片
  6. 【Selenium专题】WebDriver启动Chrome浏览器(一)
  7. nowcoder(牛客网)提高组模拟赛第一场 解题报告
  8. 该用li还是得用
  9. “全栈2019”Java第五十一章:继承与final关键字详解
  10. kali linux之Meterpreter