当前位置: 首页 > news >正文

一文带你学习C++析构函数

C++析构函数的学习

在C++中,析构函数是一种特殊类型的成员函数,用于在对象生命周期结束时被自动调用。一个对象生命周期的终止可以发生在以下情况:

  • 函数执行完毕
  • 对象被显式删除
  • 对象超出范围

在这些情况下,析构函数都会被调用,该函数负责清除对象占用的内存空间和释放其他资源。析构函数的语法如下:

1

2

3

4

5

classClassName {

public:

ClassName();// 构造函数

~ClassName();// 析构函数

};

可以看到,在类中声明析构函数时,在函数名前加上了一个波浪线符号“~”,这用来表示这是一个析构函数。与构造函数一样,析构函数也可以被重载

接下来,我们将介绍C++析构函数的一些重要知识点,并提供相应代码示例

析构函数的基本使用

当构造函数创建一个对象时,它使用new运算符分配内存。在对象不再需要时,我们需要使用delete运算符来释放内存。在这种情况下,析构函数就可以派上用场。下面是一个简单的示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#include<iostream>

usingnamespacestd;

classNumber {

private:

int* ptr;

public:

Number() {

ptr =newint;

*ptr = 0;

}

~Number() {

deleteptr;

}

intgetValue() {

return*ptr;

}

voidsetValue(intvalue) {

*ptr = value;

}

};

intmain() {

Number obj1;

obj1.setValue(5);

cout << obj1.getValue() << endl;

return0;

}

在这个示例中,我们使用了一个指向整数的指针,并在构造函数中为其分配内存。在析构函数中,我们使用delete运算符来释放该指针的内存空间。这个程序打印出5,表明成功对obj1中的整数值进行了修改

多个析构函数的使用

如果在类中定义了多个析构函数,无论是因为函数重载,还是出于其他原因,它们都会按照与它们的构造函数相同的顺序被自动调用 ,下面是一个示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#include<iostream>

usingnamespacestd;

classStudent {

private:

intage;

char* name;

public:

Student() {

age = 0;

name =newchar[10];

}

Student(inta,char* n) {

age = a;

name =newchar[strlen(n) + 1];

strcpy(name, n);

}

~Student() {

delete[] name;

}

voiddisplay() {

cout<<"Name: "<<name<<" Age: "<<age<<endl;

}

};

intmain() {

Student obj1(19,"John");

Student obj2(21,"Peter");

obj1.display();

obj2.display();

return0;

}

在这个示例中,我们定义了两个构造函数,一个默认的和一个带参数的。当我们创建两个对象时,分别使用了这两个不同的构造函数。在析构函数中,我们释放了为name指针分配的内存空间,而不管哪个构造函数被使用,这样就避免了内存泄露

继承中的析构函数

在继承中,基类的析构函数会在派生类的析构函数之前被自动调用,因此必须在基类中定义一个虚析构函数。这允许派生类中的任何资源在析构之前被清理。下面是一个示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#include<iostream>

usingnamespacestd;

classShape {

public:

Shape() {

cout<<"Shape constructor\n";

}

virtual~Shape() {

cout<<"Shape destructor\n";

}

};

classSquare:publicShape {

public:

Square() {

cout<<"Square constructor\n";

}

~Square() {

cout<<"Square destructor\n";

}

};

intmain() {

Shape* shape =newSquare();

deleteshape;

return0;

}

在这个示例中,我们定义了一个Shape基类和一个Square派生类。由于Shape类定义了虚拟析构函数,当我们通过基类指针delete Square对象时,它将首先调用Shape类的析构函数,然后再调用Square类的析构函数,确保派生类中的任何资源被清理

总结

在本文中,介绍了C++析构函数的基本知识点,包括在内存分配和释放、多个析构函数的使用和继承中的析构函数。强调了析构函数负责清理对象占用的内存空间和释放其他资源,在对象的生命周期结束时被自动调用需要注意的是,在使用析构函数时,必须确保不会在它们已被调用的对象上进行任何操作,否则可能会出现严重的编程错误。另外,在使用多个析构函数时,它们的顺序非常重要,应该按照构造函数的顺序进行调用

http://www.jsqmd.com/news/873185/

相关文章:

  • 2026适合小白的高还原度PDF转长图工具推荐合集 - 时讯资讯
  • 宝塔域名已经添加了,但ssl里面没有
  • 如何在Windows 11上快速安装安卓子系统:3步开启跨平台应用新时代
  • 安顺外贸网站建设 B2B 建站定制,WaiMaoYa 外贸鸭专业跨境建站机构 - 外贸营销工具
  • CANN-昇腾NPU-多机多卡-怎么把16卡用出32卡的效果
  • 2026年5月诚信的阻燃电缆沟盖板厂家,免费样品测试助力客户精准选型适配项目 - 品牌鉴赏师
  • P4777 【模板】扩展中国剩余定理(EXCRT)题解
  • 基于Java的外卖点餐配送系统_43lq510m
  • agent memory论文解析一:解析项目(a-mem)
  • DDrawCompat终极指南:简单三步让老游戏在Win10/11完美运行
  • Topit终极指南:如何在Mac上实现高效窗口置顶,提升300%工作效率
  • 西恩士液冷板清洁度分析仪装置 - 工业设备研究社
  • 基站正在成为 AI 计算节点:NVIDIA Aerial 推动 RAN 架构重构
  • MPC5604B/C 信号与引脚全解|硬件 / 底层必看
  • 写给新手的 asnumpy:昇腾原生 NumPy 到底是啥?
  • 题解:luogu P8996([CEOI 2022] Abracadabra)
  • 今天不建Lovable ML平台,明天就被团队弃用!2025年AI工程团队留存率预警下的4步速建法
  • AI浪潮下,软件开发行业的深度变革与未来走向
  • 深夜办公不掉链:2026免费PDF转PPT工具Top榜 - 时讯资讯
  • 投影仪的分辨率不高,仅为1024*768的分辨率,而笔记本电脑2560×1600(2.5K)分辨率。‌‌——如果采用扩展屏复制笔记本电脑分辨率,发现那个投影仪投影出的字很小,且看不清。 将笔记本电脑的
  • DriverStore Explorer终极指南:Windows驱动清理与管理的完整解决方案
  • 龙芯3A5000工业主板实战:从硬件部署到软件生态的国产化替代指南
  • 给机器人一个值得信赖的“判断力”
  • 79元工业级核心板实战:全志T113-i在PLC、HMI与网关中的应用与开发
  • 2026年PDF转PPT免费工具推荐:在线极速转换,省心又高效 - 时讯资讯
  • ESP-Mesh-Lite:基于Wi-Fi的轻量级Mesh组网方案解析与实践
  • Vue2进阶 - Ref
  • 独立开发者如何借助 Taotoken 控制个人 AI 项目开发成本
  • Jetson Nano上OpenCV C++ DNN人脸检测:CUDA加速全流程实战
  • C++跨平台线程池组件设计:从核心原理到工程实践