C++面向对象编程之析构详解

C++面向对象编程之析构详解

概述

在C++面向对象编程中,析构函数是一种特殊的成员函数,它在对象被销毁时调用。析构函数通常用于在对象被销毁前,释放对象所占用的资源,如动态分配的内存空间、文件句柄等。

析构函数的函数名与类名相同,但前面加上 "~" 符号,且析构函数没有返回值和参数。

class MyClass {
public:
    MyClass();
    ~MyClass(); //析构函数
};

析构函数的调用时机

析构函数的调用时机有两种情况:
1. 对象被销毁时自动调用
2. 手动调用

当对象被销毁时,析构函数会自动调用,这种情况下,析构函数仅被调用一次。

MyClass obj;
// obj被销毁时,析构函数自动调用

如果需要手动调用析构函数,可以使用 delete 操作符,delete 操作符会自动调用对象的析构函数,释放对象所占用的所有资源。

MyClass* pObj = new MyClass();
// 后续处理...
delete pObj;
// 手动调用析构函数,释放资源

析构函数的执行顺序

当一个对象被销毁时,所有成员变量的析构函数和基类的析构函数按照它们的声明顺序相反的顺序逐个调用。

class A {
public:
    A() {
        cout << "A Constructor" << endl;
    }
    ~A() {
        cout << "A Destructor" << endl;
    }
};

class B {
protected:
    A a1;
public:
    B() {
        cout << "B Constructor" << endl;
    }
    ~B() {
        cout << "B Destructor" << endl;
    }
};

class C : public B {
public:
    A a2;
    C() {
        cout << "C Constructor" << endl;
    }
    ~C() {
        cout << "C Destructor" << endl;
    }
};

C obj_C;
// 输出以下内容:
// A Constructor
// A Constructor
// B Constructor
// A Constructor
// C Constructor
// C Destructor
// A Destructor
// A Destructor
// B Destructor
// A Destructor

某些情况下需要手动实现析构函数

在一些情况下,需要手动实现析构函数来释放资源。比如,当类中有指针类型的成员变量时,需要手动释放堆内存。

class MyClass {
public:
    MyClass();
    ~MyClass();
private:
    int* pData;
};

MyClass::MyClass() {
    pData = new int[10];
}

MyClass::~MyClass() {
    delete[] pData;
}

示例说明

示例 1

#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass() {
        cout << "MyClass Constructor" << endl;
    }
    ~MyClass() {
        cout << "MyClass Destructor" << endl;
    }
};

int main() {
    MyClass obj;
    return 0;
}

// 输出以下内容:
// MyClass Constructor
// MyClass Destructor

在这个示例中,定义了一个 MyClass 类,其中定义了一个构造函数和析构函数。在 main 函数中,定义了一个 MyClass 对象,执行完 main 函数后,该对象会被销毁,此时析构函数会自动调用,输出 "MyClass Destructor"。

示例 2

#include <iostream>
using namespace std;

class A {
public:
    A() {
        cout << "A Constructor" << endl;
    }
    ~A() {
        cout << "A Destructor" << endl;
    }
};

class B {
protected:
    A a1;
public:
    B() {
        cout << "B Constructor" << endl;
    }
    ~B() {
        cout << "B Destructor" << endl;
    }
};

class C : public B {
public:
    A a2;
    C() {
        cout << "C Constructor" << endl;
    }
    ~C() {
        cout << "C Destructor" << endl;
    }
};

int main() {
    C obj_C;
    return 0;
}

// 输出以下内容:
// A Constructor
// A Constructor
// B Constructor
// A Constructor
// C Constructor
// C Destructor
// A Destructor
// A Destructor
// B Destructor
// A Destructor

在这个示例中,定义了三个类:A、B、C,分别在构造函数和析构函数中输出对象的创建和销毁过程。在 main 函数中,定义了一个 C 对象,执行完 main 函数后,该对象会被销毁,此时析构函数会自动调用,并按照从子类到父类的顺序逐个调用,输出相应的信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++面向对象编程之析构详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • PHP JSON格式的中文显示问题解决方法

    PHP 中 JSON 格式对于中文字符的处理方式存在一些问题,下面提供一种解决方法。 问题分析 在使用 PHP 中的 json_encode 函数将一个数组或对象转换为 JSON 字符串时,如果数组或对象中含有中文字符,那么生成的 JSON 字符串中这些中文字符会被转义成 Unicode 编码形式。 例如,以下数组: $data = [ "name…

    C 2023年5月23日
    00
  • C++获得其他程序窗体控件中信息的方法

    C++获得其他程序窗体控件中信息是一个比较常见的需求,例如在自动化测试、窗口助手等场景下都有可能用到。下面我们就介绍一下C++获得其他程序窗体控件中信息的方法。 安装Visual Studio 获得其他程序窗体控件中信息,在Windows下通过Win32 API是最常用的方法。而在Win32 API的基础上,可以利用Visual Studio提供的MFC等框…

    C 2023年5月30日
    00
  • 详解C++编程中的输入输相关的类和对象

    详解C++编程中的输入输出相关的类和对象 在C++语言中,有关输入输出流的操作由iostream库提供支持。iostream库中包括了三个类:istream、ostream和iostream,其中istream用于读取输入流,ostream用于输出流,而iostream继承了这两个类的所有方法,既可以用来读取输入流,也可以用来输出流。C++中还有一些常用的输…

    C 2023年5月22日
    00
  • 16种C语言编译警告(Warning)类型的解决方法

    16种C语言编译警告(Warning)类型的解决方法 编写代码时,编译器经常会发出警告。这些警告不一定表示代码有错误,但警告应该受到注意并解决。本文将介绍C语言编译警告的16种类型以及如何解决它们。 1. 程序参数不匹配 int main() { printf("hello World\n"); return 0; } 警告信息:warn…

    C 2023年5月23日
    00
  • linux下基于C语言的信号编程实例

    下面我将为你详细讲解“linux下基于C语言的信号编程实例”的完整攻略。 概述 在linux系统中,信号机制是进程间通信的一种方式,它能够及时地通知进程事件的发生,从而使得进程能够立即做出响应。C语言提供了一系列的信号处理函数,可以用来处理不同种类的信号。在本攻略中,我们将实现两个基于信号机制的C语言程序,分别是捕获Ctrl+C信号和定时器信号。 程序一:捕…

    C 2023年5月22日
    00
  • Visual C++ 中的ODBC编程的介绍

    Visual C++ 中的ODBC编程的介绍 什么是ODBC? ODBC全称是Open Database Connectivity,即开放数据库连接,是微软公司提出的一种面向关系型数据库的连接规范,基于ODBC开发的应用程序可以访问各种类型的数据库。 ODBC编程的步骤 加载ODBC驱动程序。 建立连接并打开数据库。 执行SQL语句。 获取执行结果。 断开连…

    C 2023年5月22日
    00
  • C++11中std::packaged_task的使用详解

    这里我将为你详细讲解“C++11中std::packaged_task的使用详解”的完整攻略。 1. 什么是std::packaged_task std::packaged_task 是一个封装了一个可调用对象(函数,函数指针,lambda表达式等)的类模板,其可以异步地执行该可调用对象,并在需要时获取该对象的结果。 std::packaged_task 可…

    C 2023年5月23日
    00
  • C语言实现简单职工信息管理系统

    C语言实现简单职工信息管理系统 1. 系统功能 本职工信息管理系统主要实现以下功能: 添加职工 显示职工信息 删除职工 修改职工信息 查找职工信息 排序职工信息 清空职工信息 退出系统 2. 系统设计 本系统主要由以下几个部分组成: 职工结构体定义 菜单函数实现 添加职工函数实现 显示职工信息函数实现 删除职工函数实现 修改职工信息函数实现 查找职工信息函数…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部