【C++ 】中类的成员函数和析构函数的作用

在C++中,类的成员函数和析构函数各自扮演着不同的角色,它们对于类的对象的生命周期管理和行为实现至关重要。

成员函数

成员函数是类的一部分,它们允许你定义类的行为,包括但不限于:

  1. 操作数据成员:成员函数可以修改或查询类的数据成员,提供对类状态的访问和更新方式。

  2. 执行特定任务:成员函数可以执行与类相关的特定计算或逻辑操作,比如计算几何形状的面积,或者对数据结构执行算法。

  3. 接口:成员函数对外界提供接口,允许其他代码与类交互,而不暴露内部实现细节。

  4. 封装:成员函数隐藏了类的内部实现,只暴露出必要的接口,这是封装原则的体现。

  5. 多态:成员函数可以被声明为虚函数,允许子类重写这些函数,实现多态性,使得基类指针或引用来调用派生类的函数成为可能。

析构函数

析构函数是一种特殊的成员函数,主要用于清理工作,当一个对象的生命期结束时,析构函数被自动调用。析构函数的作用主要包括:

  1. 资源释放:析构函数负责释放对象在生命期内分配的资源,如动态分配的内存、文件句柄、网络连接等。

  2. 清理工作:析构函数可以执行任何必要的清理操作,确保对象处于一个安全的状态,防止资源泄漏。

  3. 保证完整性:析构函数确保在对象不再使用时,所有资源都被正确释放,保持系统的稳定性和完整性。

  4. 自动调用:析构函数在对象超出作用域、程序结束或使用delete操作符删除动态分配的对象时自动调用。

  5. 无参无返回值:析构函数没有参数,没有返回类型,甚至void也不写,其名字是类名前面加上波浪线~

  6. 不可重载:析构函数不能被重载,一个类只能有一个析构函数。

总之,成员函数提供了类的功能和行为,而析构函数则负责在对象生命周期结束时的清理工作,两者共同保证了类的完整性和程序的健壮性。

调用关系

1.C++ 中的类创建对象时,如果使用delete 对象,那么会调用创建类的析构函数吗?

在C++中,当你使用new操作符来动态地在堆上创建一个对象时,如果随后使用delete操作符来释放这个对象,确实会自动调用该对象的析构函数。这是C++语言的一个重要特性,确保了资源能够得到适当的清理。

 

例如,如果你有以下的类定义:

class MyClass {
public:~MyClass() {// 析构函数体,可以在这里释放资源// 如关闭文件,释放动态分配的内存等}
};

并且你以这种方式创建和销毁对象:

MyClass* obj = new MyClass();
// 使用obj...
delete obj;  // 这里会调用MyClass的析构函数

析构函数会在delete操作执行时被调用。这与栈上对象的生命周期不同,栈上对象的析构函数在其作用域结束时自动调用。

对于数组,也有相应的规则。如果你使用new[]创建了一个对象数组,那么你应该使用delete[]来销毁它。在这种情况下,析构函数会被为数组中的每个元素调用一次。

MyClass* arr = new MyClass[10];
// 使用arr...
delete[] arr;  // 这里会为arr中的每个MyClass对象调用析构函数

请注意,析构函数应该设计为无异常的,因为如果析构函数抛出异常,程序将终止。此外,析构函数不能被显式地指定为虚函数,除非是在派生类中,这时它可以被重写,并且当使用delete操作符删除派生类的对象时,会调用正确的析构函数链(即从派生类到基类)。

 

2.如果没有使用delete 那么什么时候回调用他的析构函数呢?

在C++中,如果一个对象不是通过new关键字动态分配的,那么它的析构函数将在以下几种情况下被调用:

  1. 栈上对象

    • 当一个对象在函数的局部作用域内声明时,它的析构函数将在该函数返回时被调用。
    • 如果对象是在某个复合语句(如 {} 内部)中声明的,则当执行流离开该复合语句时,其析构函数将被调用。
  2. 自动对象

    • 自动对象通常指的是在栈上创建的对象,它们的析构函数遵循上述规则。
  3. 静态存储持续期对象

    • 在程序正常终止前,静态对象和全局对象的析构函数将被调用。这些析构函数的调用顺序与对象的构造顺序相反。
    • 注意,如果程序异常终止(例如,由于未捕获的异常),则可能不会调用静态对象的析构函数。
  4. 智能指针管理的对象

    • 如果对象是由智能指针(如std::unique_ptrstd::shared_ptr)管理的,当智能指针超出作用域或被显式重置时,智能指针会调用对象的析构函数并释放其控制的资源。
  5. 成员对象

    • 当一个对象作为另一个对象的成员时,外部对象的析构函数将调用内部成员对象的析构函数。
  6. 继承关系

    • 如果一个类是从另一个类派生的,那么当派生类的对象被销毁时,它的析构函数将被调用,之后会调用基类的析构函数。如果基类的析构函数被声明为虚函数,那么将正确调用整个继承链中的析构函数。

因此,只要对象的生命周期结束,无论是局部对象超出作用域,还是程序终止,或是智能指针失去对对象的引用,析构函数都将被调用来清理对象所占用的资源。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring-事务(三)

作者:月下山川 公众号:月下山川 1、什么是事务 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的…

证件照片换背景底色 免费 证件照片制作软件免费下载 证件照换衣服软件免费有哪些好用

证件照是我们身份认证的重要凭证,其质量和专业性都很重要。然而,很多时候,由于各种原因,我们可能无法在拍摄证件照时穿上合适的服装,这就给证件照的质量和形象带来了一定的影响。幸运的是,现在市面上出现了…

【保姆级介绍下C语言中的运算符的优先级】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🧇C语言中的运算符的优先级 🧇C语言中的运算符的优先级决定了表达…

DOM(文档对象模型)生命周期事件

前言 DOM 生命周期事件涉及到从创建、更新到销毁 DOM 元素的不同阶段。 ● 我们来看下当HTML文档加载完再执行JavaScript代码 document.addEventListener(DOMContentLoaded, function (e) {console.log(HTML parsed adn DOM tree built!, e); })● 除此之外,浏览…

Codeforces Round 925 (Div. 3) D-F

Divisible Pairs 你有两个整数 x , y x,y x,y 和一个长为 n n n 的数组 a a a。 你需要求出有多少个正整数对 ( i , j ) (i,j) (i,j) 满足&#xff1a; 1 ≤ i < j ≤ n 1 \le i < j \le n 1≤i<j≤n a i a j a_i a_j ai​aj​ 可被 x x x 整除 a i − a j a…

使用ADB命令控制logcat日志本地存储功能

使用ADB命令控制logcat日志本地存储功能 1. 需求背景 在 Android 系统上进行开发调试时&#xff0c;为了分析 bug&#xff0c;很多场景需要抓取开机log。 使用GUI界面的工程模式/开发者选项可以打开 logcat 日志的本地存储功能&#xff0c;从而可以很方便的抓取完整的开机日…

单链表(C语言详细版)

1. 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构跟火车车厢相似&#xff0c;淡季时车次的车厢会相应减少&#xff0c;旺季时车次的车厢会额外增加几节。…

3.结果映射ResultMap(关联association+collection)

结果映射ResultMap 一.结果映射 是 MyBatis 中最重要最强大的元素,简化代码,允许JDBC不支持的一些操作 1.常用属性 constructor - 用于在实例化类时&#xff0c;注入结果到构造方法中 &#xff08;一般不用&#xff09; idArg - ID 参数&#xff1b;标记出作为 ID 的结果可…

Day65 代码随想录打卡|回溯算法篇---组合总和II

题目&#xff08;leecode T40&#xff09;&#xff1a; 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含…

Linux文件编程(打开/创建写入读取移动光标)

目录 一、如何在Linux下做开发 1.vi编辑器 2.gcc编译工具 3.常用指令 二、文件打开及创建 三、写入文件 四、读取文件 五、文件“光标”位置 一、如何在Linux下做开发 所谓文件编程&#xff0c;就是对文件进行操作&#xff0c;Linux的文件和Windows系统的文件大差不差…

Python函数 之 函数基础

print() 在控制台输出 input() 获取控制台输⼊的内容 type() 获取变量的数据类型 len() 获取容器的⻓度 (元素的个数) range() ⽣成⼀个序列[0, n) 以上都是我们学过的函数&#xff0c;函数可以实现⼀个特定的功能。我们将学习⾃⼰如何定义函数, 实现特定的功能。 1.函数是什么…

剑指offer,打印从1到最大的n位数

这道题重点考察的就是我们的大数打印&#xff0c;因为如果按照普通的整形去循环打印的话&#xff0c;碰见n10的情况下就会超出整形的范围了&#xff0c;所以我们使用字符串进行打印&#xff0c;确切的说是使用字符进行打印&#xff0c;代码如下所示&#xff1a; public static…

EtherCAT主站IGH-- 11 -- IGH之fmmu_config.h/c文件解析

EtherCAT主站IGH-- 11 -- IGH之fmmu_config.h/c文件解析 0 预览一 该文件功能`fmmu_config.c` 文件功能函数预览二 函数功能介绍1. `ec_fmmu_config_init`2. `ec_fmmu_set_domain_offset_size`3. `ec_fmmu_config_page`示例用法示例详细说明三 h文件翻译四 c文件翻译该文档修改…

数据库sql语句中exists关键字的用法及原理

一、EXISTS关键字是做什么的&#xff1f; EXISTS是SQL语句中的一个关键字&#xff0c;用于判断一个子查询是否返回了任何行。如果子查询返回的结果集非空&#xff0c;EXISTS返回TRUE&#xff0c;否则返回FALSE。 二、EXISTS的基本语法示例&#xff1a; SELECT column1, colu…

氛围感视频素材高级感的去哪里找啊?带氛围感的素材网站库分享

亲爱的创作者们&#xff0c;大家好&#xff01;今天我们来聊聊视频创作中至关重要的一点——氛围感。一个好的视频&#xff0c;不仅要有视觉冲击力&#xff0c;还要能够触动观众的情感。那我们应该去哪里寻找这些充满氛围感且高级的视频素材呢&#xff1f;别急&#xff0c;我这…

打开IDEA,程序员思考的永远只有两件事!!!

微信公众号&#xff1a;牛奶 Yoka 的小屋 有任何问题。欢迎来撩~ 最近更新&#xff1a;2024/07/09 [大家好&#xff0c;我是牛奶。] 当年面试时背了很多八股文&#xff0c;但在日渐重复的机械工作中&#xff08;产品业务开发&#xff09;&#xff0c;计算机网络、操作系统、算…

混合贪心算法求解地铁线路调度

一、问题描述 城市轨道交通的繁荣发展&#xff0c;带来了车辆资源需求的日益增加。如何兼顾运营服务水平和运营成本&#xff0c;以最少的车底优质地完成运输任务成为一大严峻问题。本题在后续的描述中将由多辆动车和拖车组合而成的车组称为车底。在日常的运营组织中&#xff0…

【文档智能】LACE:帮你自动生成文档布局的方法浅尝

前言 往期很多文章都介绍了【文档智能】上布局识别&#xff08;版式分析&#xff09;的技术思路&#xff0c;版式分析是通过对文档版式进行布局识别&#xff0c;识别文档中的元素类型的过程。这次来看看一个有趣的思路&#xff0c;通过已有的元素类型&#xff0c;来生成可控的…

赠你一只金色的眼 - 富集分析和表达数据可视化

GOplot包介绍 GOplot包用于生物数据的可视化。更确切地说&#xff0c;该包将表达数据与功能分析的结果整合并进行可视化。但是要注意该包不能用于执行这些分析&#xff0c;只能把分析结果进行可视化。在所有科学领域&#xff0c;由于空间限制和结果所需的简洁性&#xff0c;切…

Agent如何帮助大模型“增强记忆”?

Agent如何帮助大模型“增强记忆”&#xff1f; 原创 格林 神州问学 2024年07月08日 17:50 日本 记忆反馈 >规划&#xff1f; 来源|神州问学 引言 去年6月份&#xff0c;Lilian发布了关于LLM驱动的Agent的结构和组件&#xff0c;其中包括规划、行动、工具还有记忆&#xff…