C++构造析构函数

        说起默认成员函数,每一个C++程序员都不会陌生,因为默认成员函数就如同是一栋大厦的地基。我们常说“基础不牢,地动山摇”,在这里得到充分的体现。本章介绍两种默认成员函数:构造函数和析构函数。

        正文开始~~~

构造函数

        相信每一个C++程序员都是从C语言走过来的,而C++作为比C更先进的语言,肯定要修改一下C语言不好的地方。比如:用C语言实现栈、队列等数据结构的时候每次都需要先对其进行初始化,但是我们程序员都是人,不是机器,肯定会有忘记的时候,忘记初始化的后果不用我多说。所以我们C++的祖师爷本贾尼博士(Bjarne Stroustrup)也是深受其扰,然后就提出了构造函数的概念,在对象被创建时,构造函数被自动执行。

构造函数的特性

 具体每条特性我会根据代码一一介绍:

  1. 函数名与类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
//一个日期类
class Date
{
public://构造函数名与类名相同,并且无返回值Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "_" << _month << "_" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{//对象实例化,自动调用构造函数Date d1(2024,4,11);d1.Print();//结果为:2024_4_11    注:VS2022测试return 0;
}

4.构造函数可以重载。 

//上面代码的构造函数还可以写成这种形式
Date(int year = 1, int month = 1, int day = 1)
{_year = year;_month = month;_day = day;
}

5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。 

//还是上面的代码,但是我们没有主动显示的写构造函数
class Date
{
public://下面的两行代码就相当于编译器自动生成的构造函数//Date()//{}void Print(){cout << _year << "_" << _month << "_" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{//对象实例化,自动调用构造函数Date d1;d1.Print();//结果为:随机值_随机值_随机值    注:VS2022测试return 0;
}

6.C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型。编译器生成的默认成员函数对于内置类型C++没有规定要不要处理,具体看编译器,而对于自定义类型会默认调用自定义类型的默认成员函数。

//在上述代码的基础上,我们又添加了一个Time类(自定义类型)
class Time
{
public://Time的构造函数,因为这是我们主动写的,所以编译器不会自动生成Time(){_hour = 0;_minute = 0;_second = 0;}void Print(){cout << _hour << "_" << _minute << "_" << _second << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
public:void Print(){cout << _year << "_" << _month << "_" << _day << endl;}
private:int _year;//内置类型,C++没有规定要不要处理,看编译器int _month;int _day;Time _t;//自定义类型,调用自定义类型的默认构造函数
};int main()
{Date d1;d1.Print();//结果为:随机值_随机值_随机值    注:VS2022测试Time t1;t1.Print();//结果为:0_0_0    注:VS2022测试return 0;
}

7.无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数全缺省构造函数我们没写编译器自动生成的构造函数都可以认为是默认构造函数

构造函数总结 

  1. 一般情况下构造函数都需要我们自己显示的去实现
  2. 只有少数情况下可以让编译器自动生成构造函数

 析构函数

        与构造函数一样,有初始化,就会有销毁,而析构函数的作用就是完成对象中资源的清理工作,所谓的资源清理工作就是,malloc了不用free;fopen了不用fclose等等,后续的工作析构函数会自动调用帮你完成。怎么样?是不是爽得很hhhhh

析构函数的特性

 具体每条特性我会根据代码一一介绍:

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值类型。

3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

typedef int DataType;
class Stack
{
public://自己写的构造函数Stack(size_t capacity = 4){_array = (DataType*)malloc(sizeof(DataType) * capacity);_capacity = capacity;_size = 0;}// 析构函数无参数无返回值,函数名是在类名前面加上~~Stack(){cout << "~Stack()" << endl;if (_array){free(_array);_array = NULL;_capacity = 0;_size = 0;}}
private:DataType* _array;int _capacity;int _size;
};int main()
{//对象实例化Stack st;//结果为:~Stack()。从结果我们可以看出自动调用了析构函数return 0;
}

5. 编译器自动生成的默认析构函数,对自定类型成员调用它的析构函数。

class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:int _year;        // 基本类型(内置类型)int _month;int _day;Time _t;		  // 自定义类型//我们没显示写析构函数,编译器自动生成析构函数,//然后去调用自定义类型的析构函数,这里跟构造函数是一样的
};
int main()
{Date d;//结果为:~Time()return 0;
}

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

析构函数总结 

1. 有资源需要显示清理,就需要写析构函数,如:Stack。
2. 有两种场景不需要显示写析构函数,默认生成就可以。
    a.没有资源需要清理,如:Date。
    b.内置类型成员没有资源需要清理,如:MyQueue。

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

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

相关文章

解决 Linux环境下 conda环境无法激活

文章目录 Linux环境下 conda环境无法激活 Linux环境下 conda环境无法激活 检查’.bashrc’ 文件 vim ~./.bashrc add export PATH"/home/[usr_name]/[miniconda3 or anacodna]/bin:$PATH" # commented out by conda initialize conda init 重启shell 重新尝试con…

网络篇01 | 入门篇

网络篇01 | 入门篇 01 各层协议目录[网络篇02 | 应用层 kcp&#xff08;王者荣耀&#xff09;](https://blog.csdn.net/qiushily2030/article/details/135835946)[网络篇03 | 应用层 quic](https://blog.csdn.net/qiushily2030/article/details/136192481)[网络篇04 | 应用层 m…

Stable Diffusion之文生图模型训练

1、数据准备 提前准备好一组相关的照片。 在线的图片处理网站 BIRME - Bulk Image Resizing Made Easy 2.0 (Online & Free) 将图片转成统一大小&#xff0c;支持批量处理&#xff0c;效率高 2、生成提示词 进入stable diffusion webui页面 旧版直接使用 train/proproc…

如何给自己的网站添加 https ssl 证书

文章目录 一、简介二、申请 ssl 证书三、下载 ssl 证书四、配置 nginx五、开放 443 端口六、常见问题解决(一)、配置后&#xff0c;访问 https 无法连接成功(二) 证书配置成功&#xff0c;但是访问 https 还是报不安全 总结参考资料 一、简介 相信大家都知道 https 是更加安全…

医院一站式后勤管理系统 processApkUpload.upload 任意文件上传漏洞复现

0x01 产品简介 医院一站式后勤管理系统由南京博纳睿通软件科技有限公司开发的一款基于现代医院后勤管理理念的业务系统,产品结合后勤业务管理特点,通过管理平台将后勤管理业务予以系统化、规范化和流程化,从而形成一套构建于平台之上且成熟完善的后勤管理体系,并可在此体系…

使用阿里云试用Elasticsearch学习:Search Labs Tutorials 搭建一个flask搜索应用

文档&#xff1a;https://www.elastic.co/search-labs/tutorials/search-tutorial https://github.com/elastic/elasticsearch-labs/tree/main/example-apps/search-tutorial Full-Text Search

Excel报表成果展示

采用Excel函数实现数据的快速计算&#xff0c;如下&#xff0c;看似很复杂&#xff0c;实际非常方便。

文献速递:深度学习肝脏肿瘤诊断---基于深度学习的肝细胞结节性病变在整片组织病理图像上的分类

Title 题目 Deep Learning-Based Classification of Hepatocellular Nodular Lesions on Whole-Slide Histopathologic Images 基于深度学习的肝细胞结节性病变在整片组织病理图像上的分类 Background 背景 Hepatocellular nodular lesions (HNLs) constitute a heterogen…

大模型拥有的数万亿个参数,这个指标如何理解

数万亿个参数这个指标是描述大型人工智能模型复杂度的一个方式。在这个上下文中&#xff0c;一个“参数”可以理解为模型中的一个配置或设置&#xff0c;它决定了模型在处理数据时的行为。这些参数在模型的训练过程中被调整和优化&#xff0c;以便模型能够更好地完成特定任务&a…

理解vuecli和nginx启动Vue项目区别

Vue CLI 和 Nginx 在启动 Vue 项目时各自扮演着不同的角色&#xff0c;它们之间存在一些关键的区别。以下是关于这两者的主要差异&#xff1a; 1.开发环境与部署环境&#xff1a; Vue CLI&#xff1a;Vue CLI 是一个基于 Node.js 的开发工具&#xff0c;主要用于在本地开发环…

面试八股——JVM★

类加载 类加载器的定义 类加载器的类别 类装载的执行过程 类的装载过程&#xff1a; 加载&#xff1a; 验证&#xff1a; 准备&#xff1a; 这里设置初始值并不是传统意义的设置初始值&#xff08;那个过程在初始化阶段&#xff09;。 解析&#xff1a; 初始化&#xff1a; …

序列化结构(protobuf)实现一个TCP服务器(C++)

Protocol Buffers&#xff08;protobuf&#xff09;是一种由Google开发的用于序列化结构化数据的方法&#xff0c;通常用于在不同应用程序之间进行数据交换或存储数据。它是一种语言无关、平台无关、可扩展的机制&#xff0c;可以用于各种编程语言和环境中。 1、首先建立proto文…

Linux服务器下安装Oracle数据库

Linux服务器下安装Oracle数据库详细说明文档&#xff1a;https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Oracle/Linux%E4%B8%8B%E5%AE%89%E8%A3%85Oracle.md ps&#xff1a;如果觉得作者写的还行&#xff0c;能够满足您的需求&#xff0c;请给作者的开源项目st…

白杨SEO:把AI结合SEO优化的工具有哪些?我常用的AIGC工具分享

前言&#xff1a;这是白杨SEO原创第523篇。为什么想到写这个&#xff1f;因为有好几个朋友问我做SEO主要用哪个AI工具来创作&#xff1f;所以就分享一下我用的工具&#xff0c;希望对大家有一点点帮助&#xff0c;需要的可以收藏。图片在公众号白杨SEO上去看。 声明&#xff1…

k8s中修复mongodb启动失败

背景 同事反馈 dev环境的yapi不能登录&#xff0c;看了一下是同事两年前用helm搭建的。单副本使用。 排查发现是后端数据库mongodb数据库挂掉。 rootdev-k8s-master03:~# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mo…

湘潭大学-编译原理-实验一+实验二

了解了DFA的化简的含义&#xff0c;按照笔者的理解&#xff0c;表示的意思是把集合不断进行划分&#xff0c;直到不可以再进行划分&#xff0c;划分的依据是当前的符号到下一个符号&#xff0c;到达的这些下一个符号&#xff0c;是否属于同一个集合&#xff0c;假设属于同一个集…

李廉洋;4.12现货黄金,美原油最新走势分析及策略。

现货黄金在美盘末将历史新高刷至2377美元/盎司。美国3月份PPI指数较上年同期上升2.1%&#xff0c;为11个月来的最高增幅&#xff0c;这份数据加之此前火爆的CPI指数&#xff0c;为美联储实现2%目标所面临的坎坷之路奠定了基础。不过&#xff0c;PPI报告中的细节让担心通胀再度加…

全面支持工业协议钡铼IOy系列模块无缝融入PLC及工业物联网架构

钡铼IOy系列模块作为工业控制领域的创新产品&#xff0c;以其卓越的性能和广泛的适用性&#xff0c;无缝融入PLC&#xff08;可编程逻辑控制器&#xff09;及工业物联网架构&#xff0c;为工业自动化领域带来了全新的可能性。下面我们将详细探讨钡铼IOy系列模块与PLC及工业物联…

图像分割:Pytorch实现UNet++进行医学细胞分割

图像分割&#xff1a;Pytorch实现UNet进行医学细胞分割 前言相关介绍项目结构具体步骤准备数据集读取数据集设置并解析相关参数定义网络模型定义损失函数定义优化器训练验证 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#x…

【Golang学习笔记】从零开始搭建一个Web框架(三)

文章目录 分组控制分组嵌套中间件 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;二&#xff09;-CSDN博客 分组控制 分组控制(Group Control)是 Web 框架应提供…