C++【类和对象】(构造函数与析构函数)

news2024/9/25 4:46:32

文章目录

  • 1. 类的默认成员函数
  • 2. 构造函数
    • 析构函数的特点
    • 3. 析构函数
    • 析构函数的特点
  • 结语

1. 类的默认成员函数

默认成员对象就是我们没有显示的写,但是编译器会自动生成的成员函数。一个类,我们不写的情况下编译器会默认生成以下6个成员函数,需要注意的是这个六个最重要的是前4个,最后两个取地址重载不重要,我们稍微了解一下就好了。其次就C++11以后还会增加两个默认成员函数,移动构造和移动赋值,这个我们后面再讲解。
默认成员函数很重要,也比较复杂,我们要从两个方面去学习:

  • 第一:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求。
  • 第⼆:编译器默认生成的函数不满足我们的需求,我们需要自己实现,那么如何自己实现?

在这里插入图片描述

2. 构造函数

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init。

析构函数的特点

  1. 函数名与类名相同。
  2. 无返回值。(返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此)
#include<iostream>
using namespace std;

class Date
{
public:
	Date()//函数名与类名相同
	{
		cout << "这个是构造函数" << endl;
		//不需要写返回值,什么都不用写
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	return 0;
}
  1. 对象实例化时系统会自动调用对应的构造函数。
    在这里插入图片描述

  2. 构造函数可以重载。

#include<iostream>
using namespace std;

class Date
{
public:
	Date()//函数名与类名相同
	{
		cout << "这个是构造函数" << endl;
		//不需要写返回值,什么都不用写
	}
	Date(int year, int month)
	{
		cout << "这是带两个参数的构造函数" << endl;
		_year = year;
		_month = month;
	}
	Date(int year, int month, int day)
	{
		cout << "这是带三个参数的构造函数" << endl;
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << '/' << _month << '/' << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	Date d2(2024, 9);
	Date d3(2024, 9, 24);
	return 0;
}
  1. 如果类中没有显式定义构造函数,则C++编译器会⾃动生成⼀个无参的默认构造函数,⼀旦用户显式定义编译器将不再生成。

  2. 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有⼀个存在,不能同时存在。 ⽆参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结⼀下就是不传实参就可以调用的构造就叫默认构造。(其实可以叫不传参构造,不用传参数的构造函数)
    在这里插入图片描述
    但是他们不能同时存在
    在这里插入图片描述

  3. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要⽤初始化列表才能解决,初始化列表,我们下个章节再细细讲解。
    在这里插入图片描述
    说明:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原⽣数据类型,如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型。

3. 析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。 析构函数的功能类比我们之前Stack实现的Destroy功能,而像Date没有Destroy,其实就是没有资源需要释放,所以严格说Date是不需要析构函数的。

析构函数的特点

  1. 析构函数名是在类名前加上字符~。(这就很像运算符~,因为运算符的~是取反,而析构正好是在构造前面加~
  2. 无参数无返回值。(这里跟构造类似,也不需要加void)
#include<iostream>
using namespace std;

class Date
{
public:
	Date()//函数名与类名相同
	{
		cout << "这是无参数的构造函数" << endl;
		//不需要写返回值,什么都不用写
	}
	Date(int year, int month, int day)
	{
		cout << "这是带三个参数的构造函数" << endl;
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << '/' << _month << '/' << _day << endl;
	}

	~Date()
	{
		cout << "这是析构函数" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

  1. ⼀个类只能有⼀个析构函数。若未显式定义,系统会自动生成默认的析构函数。

  2. 对象生命周期结束时,系统会自动调用析构函数。
    在这里插入图片描述

  3. 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定类型成员会调用他的析构函数。

  4. 还需要注意的是我们显示写析构函数,对于自定义类型成员也会调用他的析构,也就是说自定义类型成员无论什么情况都会自动调用析构函数

  5. 如果类中没有申请资源时,析构函数可以不写,直接使⽤编译器生成的默认析构函数,如Date;如果默认生成的析构就可以用,也就不需要显示写析构,如MyQueue;但是有资源申请时,⼀定要自己写析构,否则会造成资源泄漏,如Stack。

  6. ⼀个局部域的多个对象,C++规定后定义的先析构。(和栈的思想类似,栈是先进的后出,后进的先出;调用析构是先定义的后析构,后定义的先析构)

结语

这次的分享就到这里结束了~
最后感谢您能阅读完此片文章~
如果您认为这篇文章对你有帮助的话,可以用你们的手点一个免费的赞并收藏起来哟~
如果有任何建议或纠正欢迎在评论区留言~
也可以前往我的主页看更多好文哦(点击此处跳转到主页)。

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

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

相关文章

【JVM】一篇文章彻底理解JVM的组成,各组件的底层实现逻辑

文章目录 JVM 的主要组成部分类加载器&#xff08;Class Loader&#xff09;1. 加载&#xff08;Loading&#xff09;2. 链接&#xff08;Linking&#xff09;3. 初始化&#xff08;Initialization&#xff09; Execution Engine&#xff08;执行引擎&#xff09;1. 解释器&…

微服务--Docker

Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言并遵从Apache2.0协议开源。Docker提供了一种轻量级、可移植和自包含的容器化环境&#xff0c;使开发人员能够在不同的计算机上以一致的方式构建、打包和分发应用程序。 一、Docker的基本概念 容器&#xff08;Contain…

828华为云征文|使用Flexus X实例创建FDS+Nginx服务实现图片上传功能

一、Flexus X实例 什么是Flexus X实例呢&#xff0c;这是华为云最新推出的云服务器产品&#xff0c;如下图&#xff1a; 华为云推出的Flexus云服务器X系列&#xff0c;是在华为顶尖技术团队&#xff0c;特别是荣获国家科技进步奖的领军人物顾炯炯博士及其团队的主导下精心研发…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步&#xff0c;但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题&#xff0c;包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …

记一次Mac 匪夷所思终端常用网络命令恢复记录

一天莫名奇妙发现ping dig 等基础命令都无法正常使用。还好能浏览器能正常访问&#xff0c;&#xff0c;&#xff0c;&#xff0c; 赶紧拿baidu试试^-^ ; <<>> DiG 9.10.6 <<>> baidu.com ;; global options: cmd ;; connection timed out; no serve…

leetcode24. 两两交换链表中的节点,递归

leetcode24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;he…

[译] K8s和云原生

本篇内容是根据2019年8月份Kubernetes and Cloud Native音频录制内容的整理与翻译, Johnny 和 Mat 与 Kris Nova 和 Joe Beda 一起探讨了 Kubernetes 和云原生。他们讨论了 Kubernetes 推动的“云原生”应用的兴起、使用 Kubernetes 的合适场合、运行如此大型的开源项目所面临…

【Java】虚拟机(JVM)内存模型全解析

目录 一、运行时数据区域划分 版本的差异&#xff1a; 二、程序计数器 程序计数器主要作用 三、Java虚拟机 1. 虚拟机运行原理 2. 活动栈被弹出的方式 3. 虚拟机栈可能产生的错误 4. 虚拟机栈的大小 四、本地方法栈 五、堆 1. 堆区的组成&#xff1a;新生代老生代 …

叶国富学得会胖东来吗?

“大家都看不懂就对了&#xff0c;如果都看得懂我就没有机会了。”昨晚&#xff0c;实体零售迎来一则重磅消息&#xff0c;名创优品获得了全国第二大连锁超市永辉超市的大股东身份。在资本市场负反馈的压力下&#xff0c;名创优品创始人叶国富有了上述回应。 消息公布后&#x…

云服务器是干什么的?

随着云计算的发展&#xff0c;云服务器的功能逐步完善。但是还有不少用户不清楚云服务器是干什么的&#xff1f;云服务器提供了一种灵活、可扩展的计算解决方案&#xff0c;适用于各种在线业务和项目。提供虚拟化的计算资源是云服务器最基本也是最重要的功能。 云服务器是干什…

vue项目npm run serve 报错,Error: read ECONNRESET at TCP.onStreamRead

背景&#xff1a;vue2的项目&#xff0c;之前npm run serve一直可以正常使用&#xff0c;突然每次启动都会报错了&#xff0c;报错信息如下&#xff1a; node:events:492 throw er; // Unhandled error event ^ Error: read ECONNRESET at TCP.onStreamRead (n…

Android开发okhttp下载图片带进度

Android开发okhttp下载图片带进度 下载网络图片的方法有很多&#xff0c;这次介绍写用okhttp来下载网络图片&#xff0c;主要我看中的是用okhttp下载有进度返回&#xff0c;提示下用户 一、思路&#xff1a; 用OkHttpClient().newCall(request) 二、效果图&#xff1a; 三、…

“加密自由”受到威胁?Telegram已被“收编”?成立审核团队,提供用户数据!

近年来&#xff0c;随着加密货币和区块链技术的迅猛发展&#xff0c;Telegram作为一个重要的社交平台&#xff0c;因其对用户隐私的承诺和自由交流的环境&#xff0c;吸引了大量的用户。目前&#xff0c;Telegram已经成为加密货币市场最爱使用的全球通讯软件。 然而&#xff0c…

成都睿明智科技有限公司抖音开店怎么样?

在当今这个短视频与直播带货风靡的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多品牌和企业竞相追逐的新蓝海。而在这场电商盛宴中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略以及深厚的行业洞察力&#xff0c;成为了众多商家信赖…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建斗地主

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建斗地主 华为云端口放行 服务器放行对应端口8078 Docker安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、docker安装 yum install -y docker-ce3、验证 Dock…

第52课 Scratch游戏入门:五子棋

五子棋 故事背景: 会下五子棋么?五个颜色一样的棋子,横竖斜向有五个连在一起,就胜利,让我们一起来绘制一个五子棋的棋盘,同时一起开始下棋吧! 开始编程 1、删除预设的猫咪角色,使用绘制工具绘制白色和黑色的棋子。(使用圆形和圆形渐变色填充棋子) 新绘制棋盘等其他角…

刷题日记_DAY1

前言 这里记录每日随机刷的错题 两个数组的交集&#xff08;模拟&#xff09; 题目描述 题目解析 题目要求返回指定的两个字符串之间的距离&#xff0c;容易想到的一种解法就是暴力遍历&#xff0c;来个双循环&#xff0c;但时间复杂度就为N^2&#xff0c;不符合题意 for(…

20240925 每日AI必读资讯

重磅&#xff01;字节跳动发布豆包音乐模型和同声传译模型 - 包括音乐模型&#xff0c;同声传译模型、文生图2.0模型、新的基于DIT的视频生成模型S2.0、豆包通用模型pro、语音合成模型。 - 还发布了图像转视频口型同步模型和文本、音频驱动的数字人模型。 - 这些功能将全部集…

当大语言模型应用到教育领域时会有什么火花出现?

当大语言模型应用到教育领域时会有什么火花出现&#xff1f; LLM Education会出现哪些机遇与挑战? 今天笔者分享一篇来自New York University大学的研究论文&#xff0c;另外一篇则是来自Michigan State University与浙江师范大学的研究论文&#xff0c;希望对这个话题感兴趣…

visual studio 调试技巧

visual studio 调试技巧 概述 在使用visual studio 进行调试的时候&#xff0c;有几个调试方法很好用&#xff0c;这里做一些记录。 GTEST 单元测试 参考 VS2022创建C C GTEST工程 - Hello-FPGA - 博客园 (cnblogs.com) 内存查看 命令行测试动态库 附加到进程调试动态库 …