news 2026/5/23 20:53:12

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

作者头像

张小明

前端开发工程师

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 20:50:52

STM32MP1异构多核开发实战:从MCU到Linux嵌入式系统转型指南

1. 从MCU到MPU&#xff1a;为什么STM32MP1系列是嵌入式开发的下一站&#xff1f;如果你和我一样&#xff0c;在嵌入式领域摸爬滚打了几年&#xff0c;对STM32F1、F4甚至H7系列的单片机&#xff08;MCU&#xff09;已经玩得滚瓜烂熟&#xff0c;那么你可能会开始思考下一步该往哪…

作者头像 李华
网站建设 2026/5/23 20:42:05

增程式电动汽车预测型能量管理策略【附算法】

✨ 长期致力于增程式电动汽车、能量管理策略、车速预测、广义回归神经网络、动态规划研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于AIC准则的自…

作者头像 李华