022 - C++ 析构函数

这篇具有很好参考价值的文章主要介绍了022 - C++ 析构函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上期我们讨论了构造函数。认识了它是什么以及如何使用它。如果你没有看上一期,那么你一定要回去看一下。

今天我们要讨论一下它的“孪生兄弟”,析构函数,它们在某些方面非常相似。

构造函数是你创建一个新的实例对象时运行,而析构函数是在销毁对象时运行。所以当一个对象要被销毁时,析构函数会被调用。

构造函数通常是用于设置变量或做任何你需要的初始化,对应的析构函数是用于卸载变量等东西,清理你使用过的内存。

析构函数同时适用于栈和堆分配的对象。如果你使用 New 分配一个对象,当你调用 delete 时析构函数也会被调用。而如果是一个栈对象,当作用域结束时栈对象会被删除,这时析构函数也会被调用。

例子时间

让我们深入看一些例子。

我们直接使用构造函数那一期中使用的代码。

022 - C++ 析构函数

在这个例子中我们创建了 Entity 类,这里还有多个构造函数。

让我们再添加一个析构函数。

022 - C++ 析构函数

你可以看到,构造函数和析构函数在声明与定义时的唯一区别就是放在析构函数前面的波浪号。有了这个符号,你就知道这是析构了。

在这个例子中,我们只有一个简单的类,有两个成员X、Y。当我们为这两个浮点变量申请内存的时候,完全没有考虑之后怎么清除内存。在之后的系列中我们会继续讨论内存分配等所有这些复杂的问题。

继续。

022 - C++ 析构函数

我们添加一条打印消息,用于告诉我们对象已经被删除。在构造函数中,我也添加了一条信息。删除第二个构造函数,这样我们就不会搞混了。

在主函数中,实例 e 是栈分配的,只有当主函数退出时,析构函数才会被调用,所以我们实际上不会看到,因为我们的程序会在那之后立刻结束。

为了看到这个过程,我要写一个函数 Function,它将执行 Entity 的相关操作。

022 - C++ 析构函数

运行代码之后,我们可以看到下面的结果。

022 - C++ 析构函数

让我们更深入的看看它是如何工作的。

设置断点来调试一下。

022 - C++ 析构函数

你会看到 Entity 的实例 e 被创建出来,然后 X 和 Y 的位置被打印出来,最后作用域结束了,黄色箭头跳回到 Function 调用结束后的地方。

因为它的对象是在栈上创建的,当超出作用域时,它会被自动销毁。你可以看到当函数执行完成的时候,会输出删除 Entity 的信息,因为析构函数被调用了。

这就是析构函数的本质。

它只是一个特殊函数或特殊方法,在对象被销毁时被调用。

为什么要写析构函数

那么我们为什么要写析构函数呢?

因为如果在构造函数中调用了特定的初始化代码,你可能想要在析构函数中卸载或销毁所有这些东西。因为如果你不这样做,可能会造成内存泄露。

一个很好的例子是在堆上分配的对象。如果你已经在堆上手动分配了任何类型的内存,那么你需要手动清理。

如果在 Entity 类使用中或构造中分配了内存,你可能会要在析构函数中删除它们,因为当析构函数调用时,那个 Entity 实例对象会消失。

你也可以手动调用析构函数,不过我没见过很多人这样做,这样做有点奇怪。

如果你手工调用析构函数,我唯一能想到的这种情况是,如果你使用了new 来分配内存,然而当你delete 它时,你决定用 free 函数之类的东西,然后你也想手动调用它,这种情况很不常见。

你还可以像下面那样调用,就像它是任何其它函数一样。

022 - C++ 析构函数

运行之后,你可以看到有两次删除的输出。

看起来我们并没有释放任何资源,所以它不会崩溃,只是打印了这条消息两次。——析构函数只是在对象被销毁时调用,不是调用了就一定销毁对象。

这种做法不是我推荐的,不建议大家这样使用。

析构函数就是这样。

大家有其他想法可以发在评论区哈,下期再见。文章来源地址https://www.toymoban.com/news/detail-424896.html

到了这里,关于022 - C++ 析构函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

       🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:   目录 类的6个默认成员函数 构造函数 特性  析构函数 特性  析构的顺序 拷贝构造函数 特性 常引用      💬 hello! 各位铁子们大家好哇。              今日更新了类与对象的构造函数、

    2024年02月21日
    浏览(46)
  • 【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数,赋值运算符重载

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗? 并不是 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 我们实现了,编译器就不会生成了 构造函数是

    2024年02月21日
    浏览(50)
  • C++ 构造函数和析构函数 详解

    C++中用构造函数和析构函数来初始化和清理对象,这两个函数将会被编译器自动调用。对象的初始化和清理是非常重要的,如果我们不提供构造函数与析构函数,编译器会自动提供两个函数的空实现。 构造函数:主要作用于创建函数时对对象成员的属性赋值。 析构函数:主

    2024年02月02日
    浏览(52)
  • 【C++初阶】构造函数和析构函数

    📖 默认成员函数 用户没有显式实现,编译器会自动生成的成员函数,称为默认成员函数。 构造函数 :完成对象的初始化工作。 析构函数 :完成对象空间的清理工作。 拷贝构造 :使用同类对象初始化创建对象。 赋值重载 :把一个对象赋值给另外一个对象(该对象已存在

    2024年02月17日
    浏览(51)
  • C++篇----构造函数和析构函数

    在很多时候,当写了初始化,动态开辟的,需要写销毁函数,写了销毁函数之后,但是却忘记了调用这些函数,忘记调用初始化函数还好,编译器会报错,但是如果是忘记调用销毁函数,那么编译器是不会报错,但是不能说这个程序就没错哦了,反而有很大的问题,存在内存

    2024年02月01日
    浏览(44)
  • C++:构造方法(函数);拷贝(复制)构造函数:浅拷贝、深拷贝;析构函数。

    1.构造方法(函数) 构造方法是一种特殊的成员方法,与其他成员方法不同: 构造方法的名字必须与类名相同; 无类型、可有参数、可重载 会自动生成,可自定义 一般形式:类名(形参); 例: Stu(int age); 当用户没自定义构造方法时,系统将会执行默认构造方法,当用户自定义一个

    2024年02月11日
    浏览(47)
  • ⚡【C++要笑着学】(7) 默认成员函数:构造函数 | 析构函数 | 拷贝构造函数

    🔥 订阅量破千的火热 C++ 教程 👉 火速订阅 《C++要笑着学》   🔥 CSDN 累计订阅量破千的火爆 C/C++ 教程的 2023 重制版,C 语言入门到实践的精品级趣味教程。 了解更多: 👉  \\\"不太正经\\\" 的专栏介绍  ← 试读第一章 订阅链接: 🔗 《C语言趣味教程》 ← 猛戳订阅!   本篇

    2024年02月07日
    浏览(67)
  • [C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数

     个人主页:北·海  🎐CSDN新晋作者  🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:C/C++ 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 目录 构造函数有什么作用? 构造函数有什么特点 构造函数的种类 一.默认构造函数 1.什么是

    2024年02月09日
    浏览(45)
  • c++(8.23)类,this指针,构造函数,析构函数,拷贝构造函数

    设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象 p1,设计这两个类的构造函数、析构函数和拷贝构造函数。

    2024年02月11日
    浏览(38)
  • 『C++成长记』构造函数和析构函数

    🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、类的六个个默认成员函数 📒1.1认识默认成员函数  二、构造函数 📒2.1为什么要有构造函数 📒2.2构造函数的概念 📒2.3构造函数的特性 📒2.4编译器

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包