类和对象:析构函数

类和对象:析构函数析构函数是 C 等面向对象编程语言中的一个重要概念 它是类的一个特殊成员函数 用于在对象生命周期结束时执行必要的清理工作

大家好,欢迎来到IT知识分享网。


前言

析构函数是C++等面向对象编程语言中的一个重要概念,它是类的一个特殊成员函数,用于在对象生命周期结束时执行必要的清理工作。同时这也是我们学习的一大难点下面我将详细解答析构函数的细节下面就跟随小编来看看这个析构函数吧


在这里插入图片描述

析构函数是什么?

在百度百科是这么定义析构函数的:
与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~, 例如 ~ stud( ) 。
以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)
只能有一个析构函数, 不能重载 。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

构造函数可以参考我的这篇文章:类和对象:默认构造函数

基本语法

在析构函数的名字是类名加~(波浪号)下面就举一个简单的例子
在这里插入图片描述

#include <iostream>  class MyClass { 
    public: MyClass() { 
    std::cout << "Constructor called" << std::endl; // 可以在这里分配资源  } ~MyClass() { 
    std::cout << "Destructor called" << std::endl; // 可以在这里释放资源  } }; int main() { 
    MyClass obj; // 调用构造函数  // 当obj超出作用域时,调用析构函数  return 0; } 

在这里我写的析构函数名称是~Myclass,它可以将你前面的资源根据你的代码释放,它里面的内容会最后使用也就是你可以在里面写其它的东西但是不推荐这样写,但是每一个类都写一个析构的话还是太麻烦,有没有可以不写的情况呢?
在这里插入图片描述

不用析构函数的情况

#include <iostream>  class MyClass { 
    public: MyClass() { 
    i = new (int); std::cout << "创建资源" << std::endl; // 可以在这里分配资源  } ~MyClass() { 
    std::cout << "释放资源" << std::endl; // 可以在这里释放资源  delete i; } private: int* i; }; int main() { 
    MyClass obj; // 调用构造函数  // 当obj超出作用域时,调用析构函数  return 0; } 

在这段代码中我创建了一个 i 的资源于是我就将它析构,在析构函数中用了delete,如果不会用delete和new的同学可以看我的这篇文章详解c++:new和delete

析构次数

在资源析构的过程中我们如果创建了(new,malloc)多个资源我们就要析构多次(delete,free)这很麻烦但是没办法就是这么规定的,但是问题来了析构的顺序是什么呢?
在这里插入图片描述
这里我就不卖关子了,析构函数后声明的成员对象先析构,先声明的成员对象后析构。这和构造函数相反
在你系统结束时析构,在这之前你都可以使用数据和地址

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/138495.html

(0)
上一篇 2024-11-23 17:26
下一篇 2024-11-23 17:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信