构造函数和析构函数

news2025/1/20 17:03:39

1.构造函数

1.1 .构造函数概括

、构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
其特征如下:
1. 函数名与类名相同。
2. 无返回值。
3. 对象实例化时编译器自动调用对应的构造函数。
4. 构造函数可以重载。
5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。

关于编译器生成的默认成员函数,很多学生会有疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??
解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如char /int /double/float......自定义类型就是我们使用class/struct/union等自己定义的类型.

注意:C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。

2.析构函数

2.1 析构函数概念
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

析构函数是特殊的成员函数,其特征如下:
1. 析构函数名是在类名前加上字符 ~。
2. 无参数无返回值类型。
3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

5.如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

2.2 析构函数使用注意

  1. 不接受参数。
  2. 不要 (或 void) 返回值。
  3. 无法声明为 const、 volatile或 static。 但是,可以为声明为 constvolatile 或 static 的对象的析构调用它们。
  4. 可以声明为 virtual。 使用虚拟析构函数,可以在不知道对象类型的情况下销毁对象 - 使用虚拟函数机制调用对象的正确析构函数。 还可以将析构函数声明为抽象类的纯虚拟函数。

当下列事件之一发生时,将调用析构函数:

  1. 具有块范围的本地(自动)对象超出范围。
  2. 使用 delete 显式解除分配了使用 new 运算符分配的对象。
  3. 临时对象的生存期结束。
  4. 程序结束,并且存在全局或静态对象。
  5. 使用析构函数的完全限定名显式调用了析构函数。
  6. 析构函数可以随意调用类成员函数和访问类成员数据。

析构函数的使用有两个限制:

  1. 无法获取其地址。
  2. 派生类不继承其基类的析构函数。

3.构造函数和析构函数的实现顺序

构造函数和析构函数的顺序符合数据结构中站的顺序,即先进后出。

另外,构造函数和析构函数的顺序需要灵活变通:比如下面这种情况,在静态区创建的变量的销毁晚于在栈上创建的变量,在全局域中创建的变量的销毁晚于局部变量的销毁

 

 

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

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

相关文章

简单认识 Postman界面操作

查看本文前 您需要先登录Postman 如果还没有处理好 可以先查看我的文章 Postman登录注册指导 右上角的 Home 代表主页 就是我们现在看到的这个界面 Workspaces 是一个工作空间管理 这里 我们选择进入 我的工作空间 之后 我们所有的接口请求 就都是在这一块完成的 Collection…

ubuntu中安装VMware Tools,实现Windows文件拖入Ubuntu

ubantu作为一款非常好用的Linux发行版本,深受广大开发者的喜爱😃,为了开发的方便,人们常常在windows电脑中安装VMware虚拟机来运行Linux系统,我们时常会遇到这样一种情况:无法互传虚拟机与主机文件。 原因就…

终端连接工具Tabby的下载、安装与配置

目录 一、终端连接工具Tabby的下载1.1、Tabby的下载地址1.2、Tabby的下载步骤 二、终端连接工具Tabby的安装三、终端连接工具Tabby的SSH连接四、终端连接工具Tabby的SFTP 传输工具4.1、服务器上的文件传输到本地电脑4.2、本地电脑的文件传输到服务器 五、终端连接工具Tabby的设…

基于网络爬虫和SpringBoot框架的晋江文学小说小型网站项目

一、Python网路爬虫技术的设计与实现 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,常可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。项目中,主要采取Scrapy框架实现一个爬虫,抓…

JavaSE3(4/26)

目录 1.线程的状态 2.线程安全问题 3.synchronized的具体用法 4. 1.线程的状态 首先明白进程的状态:就绪或者阻塞 上述说的就绪和阻塞其实是针对系统中的线程状态(PCB) Java中对于Thread类中的线程的状态进行了进一步的细化 NEW: Thread对象有了,但是线程还没有被执行 TERMI…

RabbitMQ之介绍以及安装

1.1 MQ的相关概念 1.1.1 什么是MQ ​ MQ,从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ…

摄影tips

一、基础知识 相机挡位 A档就是全自动模式或称场景智能自动模式,该拍摄模式下,相机会根据光线和你所拍摄的对象等场景环境自行设置快门、光圈等参数,你不需要调整任何参数,拿起相机对焦按快门就行,也就是AUTO模式。虽…

opengauss编译和使用oracle_fdw

opengauss虽然继承自postgresql9.2,但由于做了魔改,网上通用的从oracle_fdw源码编译安装到postgresql的方法,是否成功的应用到opengauss,并不一定,今天试了一下,参照opengauss官网文档(其实写的…

Spring Bean的作用域及生命周期

目录 前言: Bean的作用域(Scope) 单例模式 原型模式(多例作用域) 请求作用域(request) 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结: 前…

多模态论文串讲:ALBEF VLMo BLIP CoCa Beit V3

文章目录 前言ALBEF:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation(2021-10)VLMO: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts(2021-11)relatedmethod BLIP:Bootstrapping Language-Im…

【贴片SD Card介绍】贴片SD Card (LEILONG雷龙科技)

有幸申请到了雷龙科技代理的 贴片 SD Card (SD NAND) 样品,做出测试,分享一下。 型号:CSNP32GCR01-BOW;CSNP4GCR01-BOW 生产方:CS创世半导体 由于是第一次使用贴片类型的 SD Card ,可能文章会有较多疏忽。…

【Git】Windows Git和TortoiseGit安装教程(Git2.23.0、TortoiseGit2.8.0、语言包2.8.0)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

eletron+react+antd+node开发桌面小程序并打包(electron-packager+electron-builder)

首先罗列一下项目中用到的技术: electron, react,antd, typescript, node,及打包命令:pkg,electron-packager,electron-builder及child_process实现多进程 需求:开发一个桌面应用,左…

前端架构师-week3-脚手架执行准备过程实现

目录​​​​​​​​​​​​​​ 脚手架框架代码拆包 import-local应用 检查版本号功能开发(require加载资源类型讲解 npmlog封装) 最低Node版本检查功能开发 root 账号启动检查和自动降级功能开发 用户主目录检查功能开发 入参检查和 debug…

华为OD机试真题(Java),火星文计算(100%通过+复盘思路)

一、题目描述 已知火星人使用的运算符为#、$,其与地球人的等价公式如下: x#y 2*x3*y4 x$y 3*xy2 其中x、y是无符号整数;地球人公式按C语言规则计算;火星人公式中,$的优先级高于#,相同的运算符&#x…

数字船厂信息化整体解决方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 数字船厂建设思路 智慧船厂将以信息化为基础、以数据为纽带、以制造为核心、以管理为载体打造新型智慧园区,该智慧园区整合了船厂的安全、环保、能源、安防、应急…

基于 JavaWeb 的用户报名审核平台项目

目录 一、项目的需求: 二、项目的思路流程: 三、项目的框架(基于JavaWeb): 四、项目的详细搭建 1、数据库--建库建表 2、JavaBean编写(以Status.java为例) 3、Dao层(StatusDao…

Linux系统与shell编程第一节课

目录 1.1 Linux发展历史 1.2 什么是linux? 1.3 Linux的发行版 Host-Only(仅主机模式) windows开发 linux服务 区块链, 特点:稳定,安全,可移植性,低资源消耗,开源软…

做工业品行业的财务有多难

财务 做工业品行业的财务需要具备一定的财务和会计知识,以及对行业内经济运作有一定的了解。在处理大量数据和信息方面也需要有较高的能力。此外,工业品行业往往涉及到复杂的生产过程和供应链管理,需要对这些方面有一定的了解和掌握。因此&a…

数据结构初阶(栈和队列)

文章目录 一、栈1.1 什么是栈1.2 栈的使用(1)底层代码(2)方法(3)栈的应用 二、队列2.1 什么是队列2.2 队列的使用(1)底层代码的实现(2)队列的使用 2.3 双端队…