【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.mzph.cn/news/589323.shtml

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

相关文章

Dependency Track:智能组件分析平台。

Dependency Track:智能组件分析平台。 ############################# 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使用该工具造成的损失,和本人及开发者无关。 ################…

Linux | 解决问题Ubuntu重启无法进入系统以及网络无法连接【图文详解】

Ubuntu18.04重启无法进入系统&#xff0c;重开后如图 一直在加载系统内核4.15.0-213-generic,无法加载 错误原因 原本的系统是Ubuntu16.04,使用命令升级到Ubuntu18.04版本&#xff0c;升级重启后&#xff0c;远程无法连接&#xff01; 错误解决 第一步&#xff1a;进入GRUB…

AIGC入门系列1:感性的认识扩散模型

1、序言 大家好&#xff0c;欢迎来到AI手工星的频道&#xff0c;我是专注AI领域的手工星。AIGC已经成为AI又一个非常爆火的领域&#xff0c;并且与之前的AI模型不同&#xff0c;AIGC更适合普通人使用&#xff0c;我们不仅可以与chatgpt对话&#xff0c;也能通过绘画模型生成想…

使用ASP.NET MiniAPI 调试未匹配请求路径

本文将介绍如何在使用ASP.NET MiniAPI时调试未匹配到的请求路径。我们将详细讨论使用MapFallback方法、中间件等工具来解决此类问题。 1. 引言 ASP.NET MiniAPI是一个轻量级的Web API框架&#xff0c;它可以让我们快速地构建和部署RESTful服务。然而&#xff0c;在开发过程中如…

PACC:数据中心网络的主动 CNP 生成方案

PACC&#xff1a;数据中心网络的主动 CNP 生成方案 文章目录 PACC&#xff1a;数据中心网络的主动 CNP 生成方案PACC算法CNP数据结构PACC参数仿真结果参考文献 PACC算法 CNP数据结构 PACC参数 仿真结果 PACC Hadoop Load0.2 的情况&#xff1a; PACC Hadoop Load0.4 的情况&a…

go slice源码探索(切片、copy、扩容)和go编译源码分析

文章目录 概要一、数据结构二、初始化2.1、字面量2.2、下标截取2.2.1、截取原理 2.3、make关键字2.3.1、编译时 三、复制3.1、copy源码 四、扩容4.1、append源码 五&#xff1a;切片使用注意事项六&#xff1a;参考 概要 Go语言的切片&#xff08;slice&#xff09;是对数组的…

axios的使用及说明

目录 1.说明 2.直接使用 3.封装使用 4.注意 1.说明 官网&#xff1a;Axios 实例 | Axios中文文档 | Axios中文网 Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使…

Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码

UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;从而具有GHz量级的带宽。 UWB&#xff08;超宽带&#xff09;高精度定位系统是一…

java零拷贝zero copy MappedByteBuffer

目录 调用操作系统的 mmap 未使用 mmap 的文件通过网络传输的过程 使用 mmap 的文件通过网络传输的过程 使用例子 调用操作系统的 sendfile() 在 java 中的具体实现 mmap的优劣 mmap 的不足 mmap 的优点 mmap 的使用场景 对于零拷贝&#xff08;zero copy&#xff09…

C语言实验4:指针

目录 一、实验要求 二、实验原理 1. 指针的基本概念 1.1 指针的定义 1.2 取地址运算符&#xff08;&&#xff09; 1.3 间接引用运算符&#xff08;*&#xff09; 2. 指针的基本操作 2.1 指针的赋值 2.2 空指针 3. 指针和数组 3.1 数组和指针的关系 3.2 指针和数…

【Linux】内核编译 镜像制作

文章目录 一、Ubuntu内核编译1.1 为什么自己编译内核1.2 Ubuntu 内核源码下载1.21 内核的作用1.22 Linux内核与ubuntu内核1.23 Ubuntu内核源码获取 1.3 在Windows系统下编译ubuntu内核1.4 在Linux系统下编译ubuntu内核 二、镜像制作 一、Ubuntu内核编译 1.1 为什么自己编译内核…

用LCD循环右移显示“Welcome to China“

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选择位&#xff0c;将RW位定义为P2.1引脚 sbit EP2^2; //使能…

Debezium日常分享系列之:向 Debezium 连接器发送信号

Debezium日常分享系列之&#xff1a;向 Debezium 连接器发送信号 一、概述二、激活源信号通道三、信令数据集合的结构四、创建信令数据集合五、激活kafka信号通道六、数据格式七、激活JMX信号通道八、自定义信令通道九、Debezium 核心模块依赖项十、部署自定义信令通道十一、信…

【C# 技术】 C# 常用排序方式——自定义数据排序

C# 常用排序方式——自定义数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&…

区分LR(0),SLR(1),LR(1)和LALR(1)

目录 对于LR(0)文法&#xff1a; 对于SLR(1)文法&#xff1a; 对于LR(0)和SLR(1)文法&#xff1a; 对于LR(1)和SLR(1)文法&#xff1a; 对于LALR(1)文法&#xff1a; 例题1&#xff1a; 例题2&#xff1a; 例题3&#xff1a; 例题4&#xff1a; 这几个文法大致的步骤都…

推荐几个贼有意思的开源项目!

这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内感受到开源的魅力&#xff0c;对编程产生兴趣&#xff01; C 项目 1、kilo&#xff1a;不到 1 千行代码实现的迷你文本编辑器。该项…

Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)

Portraiture汉化版PS磨皮插件。本期推荐一款全新ai算法ps2024中文汉化版ps磨皮插件Portraiture 4.1.2美颜滤镜安装包最新版ps调整肤色插件! 全新Portraiture 4.1.2版本PS人像修图美颜磨皮插件&#xff0c;升级AI算法&#xff0c;并支持多人及全身磨皮美化模式&#xff0c;推荐…

【嵌入式开发 Linux 常用命令系列 7.3 -- linux 命令行数值计算】

文章目录 linux 命令行数值计算使用 awk使用 bc 命令使用 Bash 的内置算术扩展使用 expr脚本命令实现 linux 命令行数值计算 在 Linux 命令行中&#xff0c;您可以使用多种方法来执行基本的数学运算。以下是一些示例&#xff1a; 使用 awk awk 是一个强大的文本处理工具&…

【C#】知识点实践序列之Lock的输出多线程信息

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2023年第2篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇在Lock锁定代码…

【python_数据分组】

对excel按照标签进行分组&#xff0c;例如按照“开票主体和对方公司”进行分组&#xff0c;并获取对应的明细。 表格如下&#xff1a; def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…