资讯动态

小学生学C++编程语法知识(C++析构函数详解)

发布时间:2026/8/7 8:30:14 来源:尧图企业网站定制
C面向对象析构函数到底有什么用为什么需要虚析构函数对于刚学习 C 的小学生来说构造函数像“出生”那么析构函数就是“离开世界前的最后整理工作”。很多同学知道~ClassName() { }叫析构函数。但是不知道为什么需要析构函数它什么时候执行它到底释放什么为什么父类析构函数经常要加virtual今天我们一步一步讲清楚。一、什么是析构函数先看一个普通类#includeiostream using namespace std; class Student { public: Student() { cout学生出生endl; } ~Student() { cout学生离开endl; } }; int main() { Student s; }运行学生出生 学生离开为什么没有写s.~Student();但是析构函数执行了因为C会自动调用析构函数。二、析构函数什么时候执行有三种常见情况。情况1普通对象离开作用域例如void test() { Student s; }执行过程进入函数创建s ↓ 调用构造函数离开函数s消失 ↓ 调用析构函数例如int main() { { Student s; } cout结束; }输出学生出生 学生离开 结束为什么因为{ }是一个作用域。出了大括号对象自动销毁。情况2动态创建对象 delete例如Student *pnew Student();内存堆区 ------------- | Student对象 | ------------- p | | ↓执行delete p;发生第一步调用析构函数~Student()第二步释放内存。也就是delete 析构函数 释放空间情况3程序结束全局对象销毁例如Student s; int main() { }程序结束时自动调用~Student()三、析构函数主要干什么最重要作用释放资源。什么叫资源比如1. 动态内存例如class Array { private: int *p; public: Array() { pnew int[100]; } ~Array() { delete [] p; } };构造申请空间堆 [100个int] ↑ p析构释放delete [] p;否则这块内存永远占着。这叫内存泄漏。四、为什么C需要析构函数因为C允许new申请资源。但是系统不知道什么时候释放。例如int *pnew int;如果忘记delete p;那么程序运行越久占用内存越多。所以C设计构造函数负责拿资源 初始化析构函数负责还资源 清理这就是RAII思想资源获取即初始化以后学习vectorstring智能指针都会遇到。五、析构函数调用顺序这是考试常考点。看class A { public: ~A() { coutAendl; } }; class B { public: ~B() { coutBendl; } }; int main() { A a; B b; }输出B A为什么因为后创建的先销毁。像一摞盘子先放A A 再放B B A拿的时候先拿B。这叫栈的后进先出。六、继承中的析构问题重点来了。看class Animal { public: ~Animal() { coutAnimal析构endl; } }; class Dog:public Animal { public: ~Dog() { coutDog析构endl; } };创建Dog dog;销毁}输出Dog析构 Animal析构为什么因为Dog里面包含Animal部分。销毁顺序孩子部分 ↓ 父亲部分就像小狗狗身体 动物部分先清理狗自己的东西再清理动物共有部分。七、危险来了父类指针删除子类对象看int main() { Animal *pnew Dog(); delete p; }问题p是什么类型Animal*但是实际对象Dog如果析构函数不是虚函数~Animal()那么调用Animal析构结束。Dog析构没有执行。结果Dog自己的资源没有释放。例如class Dog:public Animal { int *food; public: Dog() { foodnew int[100]; } ~Dog() { delete [] food; } };如果Dog::~Dog()没有执行那么food泄漏。八、什么是虚析构函数写class Animal { public: virtual ~Animal() { } };这叫虚析构函数。作用让删除对象时根据真实类型调用析构。例如Animal *pnew Dog(); delete p;有virtual执行Dog析构 ↓ Animal析构没有virtual执行Animal析构九、为什么父类析构函数应该设置为virtual答案如果一个类可能被继承并且可能通过父类指针删除子类对象那么必须虚析构。例如设计class Shape { public: virtual ~Shape() { } };下面class Circle:public Shape { }; class Rectangle:public Shape { };以后Shape *p; pnew Circle(); delete p;安全。十、是不是所有父类析构都必须virtual不是。例如class Student { };没有继承不用。如果这个类会被继承并且会通过父类指针管理子类那么必须virtual ~Base() { }十一、小学生记忆口诀析构函数出生靠构造离开靠析构。析构作用构造申请资源析构释放资源。普通析构谁创建谁销毁虚析构父类指针删除子类 必须看真实身份。十二、面试/竞赛总结表问题答案析构函数名字~类名()返回值没有参数没有一个类能有几个只能一个什么时候调用对象销毁时主要作用释放资源delete做什么调用析构释放内存父类析构需要virtual吗多态删除时需要虚析构作用保证子类析构被调用最后用一句话总结析构函数负责对象死亡前的清理工作如果对象可能通过父类指针删除那么父类析构函数必须声明为虚函数让C根据对象真实类型调用正确的析构函数避免资源泄漏。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价