C++ 析构函数

2025 年 8 月 29 日 | 6 分钟阅读

在 C++ 编程语言中,析构函数的作用与构造函数正好相反。它用于销毁类的对象。在一个类中只能定义一次。像构造函数一样,它也会自动调用。

析构函数被定义为构造函数。它必须与类同名。但它的前缀是波浪号(~)。

注意:C++ 析构函数不能有参数。此外,修饰符不能应用于析构函数。

语法

C++ 编程语言中,析构函数在每个类中都自动可用,但我们可以通过以下语法重新定义它们。

其中

  • 波浪号(~)用于形成 className 的析构函数。

与类的任何其他成员函数类似,我们也可以在类外部声明析构函数

C++ 析构函数示例

让我们举一个例子来说明 C++ 中自动调用的构造函数和析构函数。

示例

编译并运行

输出

Constructor Invoked
Constructor Invoked
Destructor Invoked
Destructor Invoked

说明

在这个例子中,我们创建了一个 Employee 类,它有一个构造函数和一个析构函数。当在 main() 函数中创建两个对象(e1 和 e2)时,构造函数被调用两次。当程序结束时,析构函数会按照它们创建的相反顺序自动为这两个对象调用。

什么时候需要编写用户定义的析构函数?

如果我们在类中定义了析构函数,编译器会自动为程序生成一个默认的析构函数。默认析构函数是完美的,除非我们在类中有动态分配的内存或指针。在这种情况下,需要一个自定义析构函数来释放内存并防止内存泄漏。

C++ 中用户定义的析构函数示例

让我们举一个例子来说明 C++ 中用户定义的析构函数。

示例

编译并运行

输出

Constructor: Memory allocated for name
Student Name: David
Destructor: Memory deallocated for name

说明

在这个例子中,我们创建了一个 Student 类,它为名称动态分配内存。之后,构造函数复制名称,析构函数解除分配为其分配的内存。在 main() 函数中,声明、打印并自动清理名为“David”的对象。

C++ 中的虚析构函数

在 C++ 中,虚析构函数是一种未定义行为,主要用于通过基类指针对象删除派生类对象。基类析构函数使用 virtual 关键字,确保基类和派生类析构函数在运行时都被调用,但它首先调用派生类,然后调用基类,以释放两个析构函数占用的空间。

C++ 中的虚析构函数示例

让我们举一个例子来说明 C++ 中的虚析构函数。

示例

编译并运行

输出

Base Constructor
Derived Constructor
Derived Destructor
Base Destructor

说明

在这个例子中,我们创建了一个带有虚析构函数的基类和一个从它继承的派生类。之后,一个指向基类的指针指向一个派生类的对象。当删除它时,派生析构函数和基析构函数都被调用,因为基析构函数被声明为虚函数,因此继承中的清理是正确的。

纯虚析构函数

在 C++ 编程中,纯虚析构函数是一种特殊的析构函数,在抽象基类中使用 = 0 语法声明,就像纯虚函数一样。它使类成为抽象类,这意味着该类的对象不能被实例化。但是,即使我们将函数声明为纯函数,它也必须有一个函数体(定义),因为当对象被销毁时总是会调用析构函数。

虚析构函数和纯虚析构函数之间的唯一区别是纯虚析构函数会将其基类声明为抽象类。因此,我们不能创建该类的对象。派生类不需要实现纯虚析构函数。

C++ 中的纯虚析构函数示例

让我们举一个例子来说明 C++ 中的纯虚析构函数。

示例

编译并运行

输出

Derived destructor called
Base destructor called

说明

在这个例子中,我们演示了基类中的纯虚析构函数,这使其成为抽象类。之后,析构函数仍在类外部定义,以确保正确清理。当通过基指针删除派生对象时,两个析构函数都以正确的顺序调用,从而确保安全销毁。

C++ 中析构函数的特性

C++ 中析构函数的几个特性如下:

  • 析构函数名应与类名相同,并带有波浪号 (~) 前缀。
  • 它不能被定义超过一次。
  • 析构函数是终止构造函数创建的对象的唯一方法。因此析构函数不能被重载。
  • 它不能声明为 static 或 constant。
  • 析构函数不接受任何参数,也不返回任何值。
  • 当对象超出范围时,它会自动调用。
  • 析构函数释放构造函数创建的对象所占用的内存空间。
  • 在析构函数中,对象以创建的相反顺序销毁。

析构函数何时执行?

当对象超出范围或被删除时,析构函数会自动调用。在 C++ 中,有几种情况下我们会调用析构函数。

  • 在 C++ 编程中,当函数结束时会调用析构函数。
  • 当包含局部变量的块完成时会调用析构函数。
  • 当调用 delete 运算符时会调用析构函数。

C++ 析构函数常见问题解答

1) C++ 中的析构函数是什么?

在 C++ 中,析构函数是一个特殊的成员函数,当对象超出作用域或被删除时会自动调用,用于释放资源。

2) 析构函数何时调用?

当我们需要销毁一个对象时,无论是它超出作用域还是调用 delete,它都会自动调用。

3) C++ 中的一个类可以包含多个析构函数吗?

不,一个类中只能有一个析构函数,并且不能重载。

4) C++ 中析构函数的语法是什么样的?

它是一个波浪号(~),然后是类名:~ClassName()。

5) C++ 中的虚析构函数是什么?

在 C++ 中,虚析构函数是一种未定义行为,用于通过基类指针对象删除派生类对象。