【C++ 】中类的成员函数和析构函数的作用

在C++中,类的成员函数和析构函数各自扮演着不同的角色,它们对于类的对象的生命周期管理和行为实现至关重要。

成员函数

成员函数是类的一部分,它们允许你定义类的行为,包括但不限于:

  1. 操作数据成员:成员函数可以修改或查询类的数据成员,提供对类状态的访问和更新方式。

  2. 执行特定任务:成员函数可以执行与类相关的特定计算或逻辑操作,比如计算几何形状的面积,或者对数据结构执行算法。

  3. 接口:成员函数对外界提供接口,允许其他代码与类交互,而不暴露内部实现细节。

  4. 封装:成员函数隐藏了类的内部实现,只暴露出必要的接口,这是封装原则的体现。

  5. 多态:成员函数可以被声明为虚函数,允许子类重写这些函数,实现多态性,使得基类指针或引用来调用派生类的函数成为可能。

析构函数

析构函数是一种特殊的成员函数,主要用于清理工作,当一个对象的生命期结束时,析构函数被自动调用。析构函数的作用主要包括:

  1. 资源释放:析构函数负责释放对象在生命期内分配的资源,如动态分配的内存、文件句柄、网络连接等。

  2. 清理工作:析构函数可以执行任何必要的清理操作,确保对象处于一个安全的状态,防止资源泄漏。

  3. 保证完整性:析构函数确保在对象不再使用时,所有资源都被正确释放,保持系统的稳定性和完整性。

  4. 自动调用:析构函数在对象超出作用域、程序结束或使用delete操作符删除动态分配的对象时自动调用。

  5. 无参无返回值:析构函数没有参数,没有返回类型,甚至void也不写,其名字是类名前面加上波浪线~

  6. 不可重载:析构函数不能被重载,一个类只能有一个析构函数。

总之,成员函数提供了类的功能和行为,而析构函数则负责在对象生命周期结束时的清理工作,两者共同保证了类的完整性和程序的健壮性。

调用关系

1.C++ 中的类创建对象时,如果使用delete 对象,那么会调用创建类的析构函数吗?

在C++中,当你使用new操作符来动态地在堆上创建一个对象时,如果随后使用delete操作符来释放这个对象,确实会自动调用该对象的析构函数。这是C++语言的一个重要特性,确保了资源能够得到适当的清理。

 

例如,如果你有以下的类定义:

class MyClass {
public:
    ~MyClass() {
        // 析构函数体,可以在这里释放资源
        // 如关闭文件,释放动态分配的内存等
    }
};

并且你以这种方式创建和销毁对象:

MyClass* obj = new MyClass();
// 使用obj...
delete obj;  // 这里会调用MyClass的析构函数

析构函数会在delete操作执行时被调用。这与栈上对象的生命周期不同,栈上对象的析构函数在其作用域结束时自动调用。

对于数组,也有相应的规则。如果你使用new[]创建了一个对象数组,那么你应该使用delete[]来销毁它。在这种情况下,析构函数会被为数组中的每个元素调用一次。

MyClass* arr = new MyClass[10];
// 使用arr...
delete[] arr;  // 这里会为arr中的每个MyClass对象调用析构函数

请注意,析构函数应该设计为无异常的,因为如果析构函数抛出异常,程序将终止。此外,析构函数不能被显式地指定为虚函数,除非是在派生类中,这时它可以被重写,并且当使用delete操作符删除派生类的对象时,会调用正确的析构函数链(即从派生类到基类)。

 

2.如果没有使用delete 那么什么时候回调用他的析构函数呢?

在C++中,如果一个对象不是通过new关键字动态分配的,那么它的析构函数将在以下几种情况下被调用:

  1. 栈上对象

    • 当一个对象在函数的局部作用域内声明时,它的析构函数将在该函数返回时被调用。
    • 如果对象是在某个复合语句(如 {} 内部)中声明的,则当执行流离开该复合语句时,其析构函数将被调用。
  2. 自动对象

    • 自动对象通常指的是在栈上创建的对象,它们的析构函数遵循上述规则。
  3. 静态存储持续期对象

    • 在程序正常终止前,静态对象和全局对象的析构函数将被调用。这些析构函数的调用顺序与对象的构造顺序相反。
    • 注意,如果程序异常终止(例如,由于未捕获的异常),则可能不会调用静态对象的析构函数。
  4. 智能指针管理的对象

    • 如果对象是由智能指针(如std::unique_ptrstd::shared_ptr)管理的,当智能指针超出作用域或被显式重置时,智能指针会调用对象的析构函数并释放其控制的资源。
  5. 成员对象

    • 当一个对象作为另一个对象的成员时,外部对象的析构函数将调用内部成员对象的析构函数。
  6. 继承关系

    • 如果一个类是从另一个类派生的,那么当派生类的对象被销毁时,它的析构函数将被调用,之后会调用基类的析构函数。如果基类的析构函数被声明为虚函数,那么将正确调用整个继承链中的析构函数。

因此,只要对象的生命周期结束,无论是局部对象超出作用域,还是程序终止,或是智能指针失去对对象的引用,析构函数都将被调用来清理对象所占用的资源。

 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 20:00:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 20:00:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 20:00:03       58 阅读
  4. Python语言-面向对象

    2024-07-10 20:00:03       69 阅读

热门阅读

  1. HTTP与HTTPS详解及其请求与响应报文的查看方法

    2024-07-10 20:00:03       25 阅读
  2. Postgres 与 MapLibre 实时位置共享

    2024-07-10 20:00:03       18 阅读
  3. NestJs实现各种请求与参数解析

    2024-07-10 20:00:03       26 阅读
  4. AHK的对象和类学习心得

    2024-07-10 20:00:03       19 阅读
  5. Spring中常见知识点及使用

    2024-07-10 20:00:03       27 阅读
  6. Uniapp的简要开发流程指南

    2024-07-10 20:00:03       23 阅读
  7. LeetCode //C - 204. Count Primes

    2024-07-10 20:00:03       21 阅读
  8. 【debug】keras使用基础问题

    2024-07-10 20:00:03       18 阅读
  9. Qt 绘图详解

    2024-07-10 20:00:03       23 阅读
  10. MySQL篇七:复合查询

    2024-07-10 20:00:03       26 阅读
  11. [GDOUCTF 2023]Tea writeup

    2024-07-10 20:00:03       27 阅读