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

yizhihongxing

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日

相关文章

  • MySQL数据库之内置函数和自定义函数 function

    MySQL是一个开源的关系型数据库管理系统,提供了许多内置函数和自定义函数用于操作和处理数据。这些函数可以大大简化SQL查询和数据处理的操作,提高效率和准确性。本文将介绍MySQL数据库中的内置函数和自定义函数,帮助您更好地利用函数来处理和查询数据。 内置函数 MySQL数据库提供了许多内置函数,这些函数可以用来完成各种任务,例如数学计算、字符串处理、日期和…

    C 2023年5月22日
    00
  • jQuery 1.9.1源码分析系列(十四)之常用jQuery工具

    首先先介绍一下本系列文章的背景。jQuery是一个非常流行的JavaScript库,它简化了JavaScript代码的编写和复杂DOM操作的实现,被广泛应用于Web开发中。本系列文章对jQuery 1.9.1的源码进行了分析,帮助读者深入了解jQuery的内部实现。 在本文中,我们将讨论常用的jQuery工具,这些工具是jQuery的核心库中的一部分,通过使…

    C 2023年5月23日
    00
  • C 标准库 limits.h

    C 标准库 limits.h 提供了有关整数类型(如 int、long、long long 等)的限制值(上下界)的常量定义。下面是 limits.h 中提供的一些常量及其含义: CHAR_BIT:字符类型(char)的位数,在大部分系统中这个值都为 8。 SCHAR_MIN:有符号字符类型(signed char)的最小值。 SCHAR_MAX:有符号字符…

    C 2023年5月10日
    00
  • 终于把淘宝SEO相关概念讲明白了 淘宝常用名词解读

    终于把淘宝SEO相关概念讲明白了 淘宝常用名词解读 什么是淘宝SEO? 淘宝SEO是指通过淘宝搜索引擎优化技术,提升淘宝店铺和商品在淘宝内部搜索结果页的排名,增加店铺和商品的曝光率和销售额的过程。 在实际操作中,淘宝SEO主要包括优化关键词、优化描述、提高转化率等方面。通过细节优化,使得店铺和商品更符合用户搜索习惯和需求。 淘宝常用名词解读 1. 关键词 关…

    C 2023年5月22日
    00
  • PHP使用JSON和将json还原成数组

    关于PHP使用JSON和将JSON还原成数组的攻略,可以分为以下几个步骤: 1. PHP使用JSON 1.1 创建JSON字符串 在PHP中使用json_encode()函数可以将数组转换为JSON格式的字符串。例如: $array = array( ‘name’ => ‘Tom’, ‘age’ => 25, ‘sex’ => ‘male’…

    C 2023年5月23日
    00
  • 怎么用matlab进行矩阵运算?

    下面是详细讲解如何使用MATLAB进行矩阵运算的攻略,包含以下内容: 创建矩阵 矩阵加减法 矩阵乘法 转置矩阵 获取矩阵的行列数 矩阵的逆、行列式、特征值和特征向量计算 1. 创建矩阵 MATLAB中可以使用中括号[]来创建矩阵。例如,下面的代码可以创建一个3行3列的矩阵A: A = [1, 2, 3; 4, 5, 6;7, 8, 9]; 2. 矩阵加减法 …

    C 2023年5月22日
    00
  • 激战2国服客户端官方文档具体内容

    激战2国服客户端官方文档 激战2官方文档是激战2国服的官方文档,提供了有关游戏的基础知识、游戏机制、角色职业、地图副本、PVP以及心灵法则等方面的完整介绍。本文将详细讲解激战2国服客户端官方文档的具体内容,以帮助广大玩家更好地了解游戏。 一、游戏机制 激战2国服客户端官方文档的第一部分介绍了游戏的基础知识和游戏机制。其中包括游戏的角色属性、技能系统、战斗机制…

    C 2023年5月22日
    00
  • sql 分组查询问题

    下面是关于”SQL分组查询问题”的完整攻略。 什么是SQL分组查询 在SQL中,聚合函数(如COUNT、SUM、AVG等)一般都会结合分组查询使用。分组查询将查询结果按照一个或多个列分组,然后在分组上计算聚合函数的值。集合函数只能对每个组返回一个单一的值。 分组查询语法 使用GROUP BY子句进行分组,它只能出现在WHERE子句之后,ORDER BY子句之…

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