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

 更新时间:2023年05月09日 14:21:14   作者:码出世界的淡水鱼  
在C++中,析构函数是一种特殊类型的成员函数,用于在对象生命周期结束时被自动调用,本文我们将介绍C++析构函数的一些重要知识点,并提供相应代码示例,需要的朋友可以参考下

C++析构函数的学习

在C++中,析构函数是一种特殊类型的成员函数,用于在对象生命周期结束时被自动调用。一个对象生命周期的终止可以发生在以下情况:

  • 函数执行完毕
  • 对象被显式删除
  • 对象超出范围

在这些情况下,析构函数都会被调用,该函数负责清除对象占用的内存空间和释放其他资源。析构函数的语法如下:

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

可以看到,在类中声明析构函数时,在函数名前加上了一个波浪线符号“~”,这用来表示这是一个析构函数。与构造函数一样,析构函数也可以被重载

接下来,我们将介绍C++析构函数的一些重要知识点,并提供相应代码示例

析构函数的基本使用

当构造函数创建一个对象时,它使用new运算符分配内存。在对象不再需要时,我们需要使用delete运算符来释放内存。在这种情况下,析构函数就可以派上用场。下面是一个简单的示例:

#include<iostream> 
using namespace std; 

class Number {
private:
    int* ptr;
public:
    Number() {
        ptr = new int;
        *ptr = 0;
    }
  
    ~Number() {
        delete ptr;
    }
  
    int getValue() {
        return *ptr;
    }
    
    void setValue(int value) {
        *ptr = value;
    }
};

int main() {
    Number obj1;

    obj1.setValue(5);
    cout << obj1.getValue() << endl;

    return 0;
}

在这个示例中,我们使用了一个指向整数的指针,并在构造函数中为其分配内存。在析构函数中,我们使用delete运算符来释放该指针的内存空间。这个程序打印出5,表明成功对obj1中的整数值进行了修改

多个析构函数的使用

如果在类中定义了多个析构函数,无论是因为函数重载,还是出于其他原因,它们都会按照与它们的构造函数相同的顺序被自动调用 ,下面是一个示例:

#include<iostream> 
using namespace std; 

class Student {
private:
    int age;
    char* name;
public:
    Student() {
        age = 0;
        name = new char[10];
    }

    Student(int a, char* n) {
        age = a;
        name = new char[strlen(n) + 1];
        strcpy(name, n);
    }
  
    ~Student() {
        delete [] name;
    }

    void display() {
        cout<<"Name: "<<name<<" Age: "<<age<<endl;
    }
};

int main() {
    Student obj1(19, "John");
    Student obj2(21, "Peter");
    obj1.display();
    obj2.display();

    return 0;
}

在这个示例中,我们定义了两个构造函数,一个默认的和一个带参数的。当我们创建两个对象时,分别使用了这两个不同的构造函数。在析构函数中,我们释放了为name指针分配的内存空间,而不管哪个构造函数被使用,这样就避免了内存泄露

继承中的析构函数

在继承中,基类的析构函数会在派生类的析构函数之前被自动调用,因此必须在基类中定义一个虚析构函数。这允许派生类中的任何资源在析构之前被清理。下面是一个示例:

#include<iostream> 
using namespace std; 

class Shape {
public:
    Shape() {
        cout<<"Shape constructor\n";
    }
  
    virtual ~Shape() {
        cout<<"Shape destructor\n";
    }
};

class Square: public Shape {
public:
    Square() {
        cout<<"Square constructor\n";
    }
  
    ~Square() {
        cout<<"Square destructor\n";
    }
};

int main() {
    Shape* shape = new Square();
    delete shape;

    return 0;
}

在这个示例中,我们定义了一个Shape基类和一个Square派生类。由于Shape类定义了虚拟析构函数,当我们通过基类指针delete Square对象时,它将首先调用Shape类的析构函数,然后再调用Square类的析构函数,确保派生类中的任何资源被清理

总结

在本文中,介绍了C++析构函数的基本知识点,包括在内存分配和释放、多个析构函数的使用和继承中的析构函数。强调了析构函数负责清理对象占用的内存空间和释放其他资源,在对象的生命周期结束时被自动调用

需要注意的是,在使用析构函数时,必须确保不会在它们已被调用的对象上进行任何操作,否则可能会出现严重的编程错误。另外,在使用多个析构函数时,它们的顺序非常重要,应该按照构造函数的顺序进行调用

到此这篇关于一文带你学习C++析构函数的文章就介绍到这了,更多相关C++析构函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈C++中const与constexpr的区别

    浅谈C++中const与constexpr的区别

    C++11中新增加了用于指示常量表达式的constexpr关键字。本文将带大家详细了解一下const与constexpr之间的区别,需要的小伙伴们可以参考一下
    2021-11-11
  • c++模拟实现string类详情

    c++模拟实现string类详情

    这篇文章主要介绍了c++模拟实现string类详情,string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中,下面进入文章一起看看详细内容吧
    2022-01-01
  • C语言详细讲解const的用法

    C语言详细讲解const的用法

    今天探讨const,首先来说是将变量常量化。为什么要将变量常量化,原因有诸多好处有诸多。比如可以使数据更加安全不会被修改
    2022-05-05
  • 关于PCL出现"无法找到 pcl_commond.dll 文件程序无法执行"的问题及解决方法

    关于PCL出现"无法找到 pcl_commond.dll 文件程序无法执行"的问题及解决方法

    这篇文章主要介绍了PCL出现"无法找到 pcl_commond.dll 文件程序无法执行"的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C语言数组越界引发的死循环问题解决

    C语言数组越界引发的死循环问题解决

    本文主要介绍了C语言数组越界引发的死循环问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++容器适配与栈的实现及dequeque和优先级详解

    C++容器适配与栈的实现及dequeque和优先级详解

    这篇文章主要介绍了C++容器适配与栈的实现及dequeque和优先级,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C++ 异常的详细介绍

    C++ 异常的详细介绍

    这篇文章主要介绍了C++ 异常的详细介绍的相关资料,希望通过本文大家能够掌握C++异常的使用方法,需要的朋友可以参考下
    2017-09-09
  • 详解C++中String类模拟实现以及深拷贝浅拷贝

    详解C++中String类模拟实现以及深拷贝浅拷贝

    这篇文章主要介绍了详解C++中String类模拟实现以及深拷贝浅拷贝的相关资料,希望通过本文能帮助到大家,让大家实现这样的方法,需要的朋友可以参考下
    2017-10-10
  • MATLAB全网最全的colormap的使用教程详解

    MATLAB全网最全的colormap的使用教程详解

    众所周知,MATLAB中的colormap只有少得可怜的几种,有很多应用在很特殊的图形中的colormap几乎都没有,而每次写代码都要去找颜色的图属实太麻烦。所以本文将包全部集成了进来,终于有了这套包含200个colormap的工具函数,希望对大家有所帮助
    2023-02-02
  • 使用C/C++访问MySQL的教程详解

    使用C/C++访问MySQL的教程详解

    在实际开发中,语言连接MySQL是为了能够在编程语言中与MySQL数据库进行交互和操作,大部分情况我们都是通过语言连接MySQL,建立与MySQL数据库的连接,本篇文章主要讲解使用C/C++访问MySQL的教程,需要的朋友可以参考下
    2024-08-08

最新评论