【c++————————构造函数和析构函数】

【c++————————构造函数和析构函数】


在这里插入图片描述

欢迎阅读新一期的c++模块————构造函数和析构函数

✒️个人主页:-Joker-

🏷️专栏:C++

📜代码仓库:c_code

🌹🌹欢迎大佬们的阅读和三连关注,顺着评论回访🌹🌹


文章目录

  • 【c++————————构造函数和析构函数】
  • 构造函数
  • 构造函数的特性
    • 1.默认构造函数
    • 2.含参的构造函数
    • 3.构造函数的重载
    • 4.在一个类里面,有且只能存在一个构造函数
  • 析构函数
    • 2.和构造函数一样,一个类里面也只能有一个析构函数,并且析构函数并不能进行重载。
    • 3.默认析构函数
    • 4.析构函数的使用场所
  • 构造函数和析构函数的调用顺序
  • 总结


构造函数

在之前C语言的学习中中我们通常会使用一个函数Init来对对象进行初始化,而在C++中为我们提供了一个新的函数来进行初始化————构造函数

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象,
即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数
,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。


`

构造函数的特性

1.默认构造函数

在C++中,我们将不给出实参的构造函数统称为默认构造函数
在C++中,我们可以这样来使用默认构造函数
例如

class Date
{
private:int _year;int _month;int _day;
public:Date(){_year = 2023;_month = 12;_day = 31;}void Display();
};

在上面的代码中,Date()就是对我们的默认构造函数,它的作用是初始化我们的_year等对象。

另外,在当我们忘记写显示构造函数的时候,编译器会自动默认给我们写上一个无参的构造函数(默认构造函数),但是编译器给我们的是一个不含任何语句的默认构造函数,所以,如果我们需要在默认构造函数内进行赋值,就必须手动写默认构造函数。另外,如果我们写了显示构造函数的话,编译器就不会帮我们自动添加默认构造函数了

2.含参的构造函数

和函数一样,构造函数也分为了含参和不含参。
例如

Date(int year,int month,int day)
{_year = year;_month = month;_day = day;
}

这个Date就是一个含参的构造函数,但是需要注意,在默认构造函数中,我们可以不添加参数,但是当我们一旦添加了含参的构造函数以后,我们就需要在定义对象的时候添加参数。这里同样可以通过缺省参数的方式来自己添加需要传的参数,可以部分缺省,也可以全缺省。

Date(int year=2023,int month=1,int day=1)
{_year = year;_month = month;_day = day;
}

3.构造函数的重载

构造函数同样也支持函数重载(函数名需要保持一致,但是参数类型和顺序必须不一致)。

Date(int year=2023,int month=1,int day=1)
{_year = year;_month = month;_day = day;
}Date(long long year=2023,int month=12,long long day=31
{_year=year;_month=month;_day=day;
}

4.在一个类里面,有且只能存在一个构造函数


析构函数

析构函数的作用和构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

我们在定义析构函数的时候要在函数名前面加上‘~”,并且和构造函数相同,析构函数也没有参数、返回值和类型。

class stack
{
private:int top;int* a;int capacity;
public:stack(int n);void pushstack(int *p,int x);~stack();

~stack()就是一个析构函数。

2.和构造函数一样,一个类里面也只能有一个析构函数,并且析构函数并不能进行重载。

3.默认析构函数

在我们写类和对象时,如果没有添加析构函数,编译器就会默认给我们添加一个析构函数-默认析构函数,但是他和默认构造函数不同,默认构造可以进行操作,而默认析构函数什么也不会做。

4.析构函数的使用场所

当我们需要对空间资源进行开辟的时候,我们需要写一个析构函数来对我们所开辟的空间进行资源释放。另外,如果我们不需要申请资源,我们也可以选择不写析构函数,但是如果有申请就必须写上,不然会造成资源的浪费或泄露。

构造函数和析构函数的调用顺序


构造函数和析构函数的调用顺序为:

先构造的后析构,后构造的先析构

例如下面的程序

class DateTime
{
public:DateTime(){cout << "DateTime()" << endl;}~DateTime(){cout << "~DateTime()" << endl;_hours = 0;_minutes = 0;_seconds = 0;}
private:int _hours;int _minutes;int _seconds;
};class Date
{
private:int _year = 2023;int _month = 12;int _day = 31;// 自定义类型DateTime dt;
};
int main()
{Date d1;Date d2;return 0;
}

在这里插入图片描述


总结

一般来说,如果在全局范围定义对象,那么它的构造函数在本文件模块中的所有函数执行之前调用,如果一个程序包含多个文件,那么它的构造函数的调用顺序是不确定的,当main函数结束或者调用exit结束程序时,调用析构函数!

如果定义局部对象,那么定义时自动调用构造函数。函数调用结束时,自动调用析构函数!


以上就是关于构造函数和析构函数的内容,今年的最后一片博客了!各位佬们麻烦支持一波,顺着评论回访🌹🌹🌹

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

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

相关文章

让你的 Python 代码更快的 9 个技巧

在最近参加的一些技术会议上,我常常听到参会员在会中讨论技术选型时提到“Python太慢了”。然而,这种观点往往没有考虑到Python的众多优点。实际上,如果能够遵循Pythonic的编程风格,Python的运行速度可以非常快。这其中的关键在于掌握一些技术细节上的巧妙技巧。那些经验丰…

使用内网穿透轻松实现在外远程访问本地威联通QNAP NAS

文章目录 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 前言 购入威联通NAS后&#xff0c;很多用户对于如何在外在公网环境下的远程访问威联通NAS…

C语言转WebAssembly的全流程,及Web端调用测试

第一步&#xff1a;安装环境 参考网址&#xff1a;https://emscripten.org/docs/getting_started/downloads.html 具体过程&#xff1a; 克隆代码&#xff1a;git clone https://github.com/emscripten-core/emsdk.git进入代码目录&#xff1a;cd emsdk获取最新远端代码&…

Sectigo证书:为什么它是网站安全的黄金标准?

Sectigo&#xff0c;原名Comodo CA&#xff0c;是全球领先的SSL证书颁发机构&#xff0c;有着20年的网络安全和加密经验。作为一家服务于超过150个国家/地区的组织&#xff0c;Sectigo已颁发超过10亿个数字证书。 Sectigo的SSL证书以高性价比著名&#xff0c;其单域名DV型的证书…

【开源】基于Vue+SpringBoot的学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

【Spark精讲】一文搞懂Spark钨丝Tungsten

Tungsten 内存管理机制 催生 Tungsten 内存管理优化的原因主要来自两个方面 。 • Java对象占用内存空间大。 相对于 C/C等更加底层的程序语言&#xff0c; Java对象的存储密度相对偏低。 例如&#xff0c;即使最简单的 “abed” 字符串&#xff0c;用Java的UTF-16编码的情况…

HarmonyOS 通过AppStorage定义组件共享数据

我们实现组件间共享数据可以通过 AppStorage 他下面有两个函数可以实现这一功能 SetOrCreate和Set AppStorage.SetOrCreate("dataMap",{name:"小猫猫" }) AppStorage.Set("dataMap",{name:"小猫猫" })Set是 如果键值存在 他会覆盖 但…

2023年终总结丨很苦,很酷!

文章目录 个人简介丨了解博主写在前面丨博主介绍年终总结丨博主成就年终总结丨博主想说年终总结丨学习芝士年终总结丨未来展望写在后面丨新年快乐 个人简介丨了解博主 主页地址&#xff1a;https://blog.csdn.net/m0_68111267 荣誉身份 ⭐2022年度CSDN 社区之星 Top6 ⭐2023年…

波特云 集装箱和 海恒蓝 集装箱 自动化集装箱下单方案

背景&#xff1a; 这几天 遇到了一个客户 是做外贸的 需要大量多的集装箱&#xff0c;了解后 他们是需要在平台上 下单集装箱 才有可能预约到集装箱使用&#xff0c;所以公司每天都需要都需要派个人 盯着电脑来 下单集装箱。 波特云 网站&#xff1a;https://www.eportyun.com…

图像去雾/图像去雨(matlab/python)

图像去雾和图像去雨是计算机视觉领域的两个重要问题&#xff0c;旨在改善被大气条件或降雨影响而模糊或噪声化的图像质量。这两个技术在很多实际应用中具有广泛的价值&#xff0c;包括无人驾驶、安防监控、航空航天等领域。下面将分点介绍图像去雾和图像去雨的相关内容。 1. 图…

12.30 二叉树中等题

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff…

嵌入式学习路线

嵌入式系统是一种将软件和硬件紧密结合的技术&#xff0c;首先我们要认识到&#xff0c;无论我们是专注于软件开发还是硬件开发&#xff0c;最终的目标都是为了更好的工作和职业发展。 根据企业的规模和需求&#xff0c;大公司更倾向于将职责分得更细&#xff0c;例如软件分为…