【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.mfbz.cn/a/282890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea 出现Cannot resolve symbol ‘springframework‘解决方法

Maven手动重新加载 1&#xff09;File–>Invalidate Caches / Restart… 清理缓存&#xff0c;重启idea客户端 2&#xff09;File–>Maven–>Reload project重新从maven中加载工程依赖的组件

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语&#xff0c;使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验&#xff0c;根据医疗不良事件的事件类型、处理事件的不同部门&#xff0c;灵活设置…

【FileZilla的安装与使用(主动与被动模式详解,以及如何利用FileZilla搭建FTP服务器并且进行访问)】

目录 一、FileZilla介绍 1.1 简介 1.2 重要信息和功能 二、FileZilla的安装与使用 2.1 FileZilla服务端安装与配置 2.1.1 安装步骤 2.1.2 新建组 2.1.3 新建用户 2.1.4 新建目录 2.1.5 权限分配 &#xff08;1&#xff09;用户Milk权限分配 &#xff08;2&#xff…

MCS接口技术----定时/计数,中断

目录 一.中断系统相关寄存器 1.51单片机中断系统的总体结构&#xff1a; 2.中断源的中断级别&#xff08;由高到低&#xff09;&#xff1a; 3.与中断有关的四个寄存器&#xff1a; &#xff08;1&#xff09;TCON---定时控制寄存器 &#xff08;2&#xff09;IE---中断允…

【算法】哈希算法和哈希表

一、哈希算法 哈希算法是一种将任意长度的数据&#xff08;也称为“消息”&#xff09;转换为固定长度字符串&#xff08;也称为“哈希值”或简称“哈希”&#xff09;的数学函数或算法。这个固定长度的字符串是由输入数据通过一系列的运算得到的&#xff0c;并且具有一些重要…

docker里面不能使用vim的解决办法

docker里面不能使用vim的解决办法 目录 docker里面不能使用vim的解决办法 1.在使用时会出现 2.在使用这些都不能解决的时候考虑 3.测试是否可用 1.在使用时会出现 bash: vim: command not found 出现这种错误时首先考虑使用 apt-get update 然后在用 apt-get install …

2024 Win 安装Oracle12C

文章目录 一、下载1.1 官方下载1.2 官方Archive下载1.3 博主提供 二、安装2.1 解压2.2 安装 三、连接3.1 SQL Plus3.2 切换到容器数据库orclpdb3.3 查询SID 四、查看数据4.1 SQL Develop 连接4.2 创建新用户4.3 develop 直接创建新用户4.3.2 SQL 错误: ORA-65096: 公用用户名或…

App.vue中引入自定义组件

components目录中定义组件&#xff1a;Person.vue 目录截图&#xff1a; Person.vue文件中内容&#xff1a; <template><div class"person"><h2>姓名&#xff1a;{{name}}</h2><h2>年龄&#xff1a;{{age}}</h2><!--定义了…

LeetCode每日一题.04(不同路径)

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示例 1…

创建型设计模式 - 抽象工厂模式 - JAVA

创建型设计模式 - 抽象工厂设计模式 一. 简介二. 列子2.1 定义电脑的抽象类和子类2.2 定义抽象工厂类和其实现类2.3 测试 三. 抽象工厂设计模式的好处四. 抽象工厂模式的案例 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续…

Linux 安装 mysql【使用yum源进行安装】

配置yum 源 首先&#xff0c;去到mysql网站&#xff0c;找到它的rpm的资源包 “mysql80-community-release-el9-5.noarch.rpm” 我们将其下载下来&#xff0c;然后配置yum源&#xff08;下面两种方式二选一即可&#xff09; ① 使用xftp传输&#xff0c;然后配置yum源 rpm …

从0到1入门C++编程——01 C++基础知识

文章目录 一、工具安装二、新建项目三、设置字体、注释、行号四、C基础知识1.数据类型2.输入输出3.运算符4.选择、循环结构5.跳转语句6.数组7.函数8.指针9.结构体 一、工具安装 学习C使用到的工具是Visual Studio&#xff0c;Visual Studio 2010旗舰版下载链接&#xff1a;点此…

Qt基础之四十五:Qt国际化(I18N)

国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),这种奇葩的缩写方式,让我想起了NBA球星“字母哥”。 下面看下Qt实现的动态语言切换效果。 一.效果 二.源码 QHSettingDialog.h #ifndef QHSETTINGDIALOG_H #define QHSETTINGDIALOG_H#…

虚拟专线网络(IP-VPN)

虚拟专线网络(IP-VPN)&#xff0c;因为它的安全性和可靠性。通过亚洲领先的 IP VPN 提供商。享受更高的可管理性和可扩展性&#xff0c;在多个站点之间交付 IP 流量或数据包&#xff0c;拥有亚太地区最大的 IP 骨干网。 1&#xff0c;保证正常运行时间&#xff0c;在网络链路发…

修改一个VC++访问数据库源码

下载一个VC6访问数据库的源码;修改; 打开工程先出现下图错误; 根据资料,出现此错误,解决方法: 1.如果用户不需要在 WizardBar,请关闭该的 WizardBar 并重新启动 Visual C++6.0。 如果但是,您想访问 WizardBar 功能,请关闭受影响的工作区之前关闭所有窗口。 2.重新生…

设计模式:抽象工厂模式(讲故事易懂)

抽象工厂模式 定义&#xff1a;将有关联关系的系列产品放到一个工厂里&#xff0c;通过该工厂生产一系列产品。 设计模式有三大分类&#xff1a;创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…

Docker九 | Swarm mode

目录 Swarm基本概念 节点 服务和任务 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 Swarm基本概念 节点 节点分为管理节点(manager)和工作节点(worker) 管理节点 管理节点用于Swarm集群的…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

Langchain-Chatchat开源库使用的随笔记(一)

笔者最近在研究Langchain-Chatchat&#xff0c;所以本篇作为随笔记进行记录。 最近核心探索的是知识库的使用&#xff0c;其中关于文档如何进行分块的详细&#xff0c;可以参考笔者的另几篇文章&#xff1a; 大模型RAG 场景、数据、应用难点与解决&#xff08;四&#xff09;R…

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传&#xff0c;但是自己搭文件服务器会有很多运维的问题&#xff0c;比如磁盘满了要扩容…
最新文章