【C++】————类和对象(中)

 9efbcbc3d25747719da38c01b3fa9b4f.gif

                                                      作者主页:     作者主页

                                                      本篇博客专栏:C++

                                                      创作时间 :2024年6月22日

9efbcbc3d25747719da38c01b3fa9b4f.gif

一、类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6 个默认成员函数

1.1构造函数:

首先我们来说一下构造函数,构造函数其实就是和所在的类名字相同的一个函数,并且在创建类类型对象时自动调用该函数,保证每个函数都有一个初始值,并且在对象的生命周期内只调用一次。

其特征如下:

  • 1、函数名与类名(域名)相同。
  • 2、无返回值(不需要去管原因,就是这么设计的)
  • 3、对象实例化时编译器自动找到对应的构造函数
  • 4、构造函数可以重载

这里面就是两个构造函数:

我们可以看到这两个名字相同,但是我们在调用时可以通过调用方式将他们分别开

class Date
{
public:
 
	Date()
	{
		_year = 0;
		_month = 0;
		_day = 0;
	}
	
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

 看下面这个代码即可了解上面构造函数第三点的意思

int main()
{
	Date d1; //调用无参构造函数
	Date d2(2022, 3, 3);  //调用带参的构造函数
}

但是在这里,我们更推荐去使用全缺省构造函数,像这样:

class Date
{
public:
 
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

这样就可以只写一个函数,并且可以达到以上两个函数的作用

如果类中没有显式定义构造函数,则 C++ 编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
关于编译器生成的默认成员函数,会有很多疑惑:在我们不实现构造函数的情况下,编译器会生成 默认的构造函数。但是看起来默认构造函数又没什么用?对象调用了编译器生成的默认构造函数,但是对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么卵用??

1.2析构函数:

下面我们来说一下析构函数,这个函数的作用与我们之前在栈,队列中所写的Destroyed函数作用大致相同,对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

其 特征 如下:

  • 1、其形式是和构造函数很像,就是在类名之前加上~。
  • 2、无参数返回值
  • 3、一个类有且只有一个析构函数,如果没有,系统会默认生成析构函数
  • 4、对象生命周期结束时,编译器会自动调用析构函数。

上面函数中的析构函数,但在这其实没有什么作用,主要作用是让你知道会调用。 

class Date
{
public:
	Date(int year=0,int month=0,int day=0)
	{
		_year = year;
		_month = month;
		_day = day;
	}
 
	~Date()
	{
		//Date类没有资源要清理,不用实现析构也可以
		cout << "~Date()" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
 
};
int main()
{
	Date d1;
	Date d2(2022, 3, 3);
}

在日起类中的析构函数似乎没什么用处,但在栈类中的析构函数却有着十分重要的作用

class stack
{
public:
 
	stack(int capcity = 4)  //将上面的合而为一
	{
		if (capcity == 0)
		{
			_a = nullptr;
			_size = _capcity = 0;
		}
		else
		{
			_a = (int*)malloc(sizeof(int) * capcity);
			_size = 0;
			_capcity = capcity;
		}
	}
	void push(int x)
	{}
	//stack的析构函数具有重大意义
	~stack()
	{
		cout << "~Stack()析构函数" << endl;
		free(_a);
		_a = nullptr;
		_size = _capcity = 0;
	}
 
private:
	int* _a;
	int _size;
	int _capcity;
 
};
int main()
{
	stack st1;   
	stack st2;
	return 0;
}

构造与析构顺序:st1先构造,st2后构造,st2先析构,st1后析构(原因是st1和st2的的生命周期实在mai函数内,当main函数执行到结尾要返回时,再进行析构,所以析构的顺序与定义的顺序相反)

s1,s2是存在栈中的,但s1,s2指向的空间是堆上面的,堆上的资源不手动释放是不会释放的

总结:析构函数完成对象中资源的清理,如果类对象需要资源清理,才需要自己实现析构函数。析构函数生命周期到了以后,自动调用

1.3拷贝构造函数  :

拷贝构造函数:只有单个形参,该形参是对本 类类型的引用(一般用const修饰),就是用已存在的类类型对象创建新的对象,由编译器自动调用。

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
 //这里使用别名的方式进行拷贝构造,使用传值会出现无穷递归调用的情况
	Date(const Date& d) //拷贝构造函数
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
 
private:
	int _year;
	int _month;
	int _day;
 
};
 
int main()
{
	Date d1(2022,3,3);
	Date d2(d1);
 
	
    return 0;
}

拷贝构造函数也是特殊的成员函数,其特征如下:

1. 拷贝构造函数是构造函数的一个重载形式。                                                                     

2. 拷贝构造函数的参数只有一个且必须使用引用传参(一般用const修饰),使用传值方式会引发无穷递归调用。(调用拷贝构造函,需要先传参数,传值传参又是一个拷贝构造。)若未显示定义,系统生成默认的拷贝构造函数。

二、赋值运算符重载

2.1运算符重载:

在C++中,为了增加代码的可读性增加了运算符重载,运算符重载是具有特殊函数名的函数,也具有返回值的类型,函数名字以及参数序列,其返回值与参数列表与普通的函数类似。

函数名字:关键字operator后面接上需要的运算符符号

函数原型:返回值类型operator操作符(参数列表)

  • 不能通过连接其他符号来创建新的操作符:比如operator@
  • 重载操作符至少存在一个参数为类类型参数
  • 用于内置类型的运算符,其含义不能改变,例如:内置类型的+,不能改变其含义
  • 作为类成员函数重载时,其形参看起来比操作数目少1,因为成员函数的第一个参数为隐藏的this
  • .* 、:: sizeof ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

最后:

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。

3.成年人的世界,只筛选,不教育。

4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。

5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

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

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

相关文章

MySQL数据库中的索引知识

MySQL数据库中索引的作用是用来加快数据的查询速度。 索引 index&#xff08;表的层面&#xff09; 在数据库中使用select来查询数据的时候会一条一条得去查询符合要求的数据&#xff0c;而索引就相当于在这张表中依据某一个字段的数值给这张表的数据创建了一个目录。目录帮…

MK的前端精华笔记

文章目录 MK的前端精华笔记第一阶段&#xff1a;前端基础入门1、&#xff08;1&#xff09;、&#xff08;2&#xff09;、 2、3、4、5、6、7、 第二阶段&#xff1a;组件化与移动WebAPP开发1、&#xff08;1&#xff09;、&#xff08;2&#xff09;、 2、3、4、5、6、7、 第三…

发布微信小程序需要icp证吗?

微信小程序需要办理ICP许可证吗&#xff1f; 微信小程序需不需要办理ICP许可证&#xff0c;具体要看你的小程序类目是什么&#xff0c;还要看你的小程序具体是做什么的&#xff1f; 根据《互联网信息服务管理办法》 第四条 国家对经营性互联网信息服务实行许可制度&#xff1b…

微信小程序反编译 2024 unveilr.exe

ps&#xff1a;一开始用的反编译工具是wxappUnpacker&#xff0c;后面改为 unveilr.exe 1.先找到小程序安装目录“E:\聊天记录\WeChat Files\Applet”&#xff0c;要反编译小程序的包 文件夹下的名字对应的是小程序ID&#xff0c;如果不确定是哪个&#xff0c;可以删除->打…

Open3D点云处理学习

Color ICP Colored point cloud registration — Open3D 0.11.0 documentation Colored point cloud registration - Open3D 0.18.0 documentation 展示了使用color-icp结果 对比gicp错误处理结果 intel自己的论文 Colored Point Cloud Registration Revisited 优化方程 参…

JVM专题六:JVM的内存模型

前面我们通过Java是如何编译、JVM的类加载机制、JVM类加载器与双亲委派机制等内容了解到了如何从我们编写的一个.Java 文件最终加载到JVM里的&#xff0c;今天我们就来剖析一下这个Java的‘中介平台’JVM里面到底长成啥样。 JVM的内存区域划分 Java虚拟机&#xff08;JVM&…

51单片机STC89C52RC——6.1 中断系统

一&#xff0c;文字层面理解 反正我看下面的几段文字时脑壳没有正常运转。一个头几个大 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求CPU暂停当前的工作&#xff0c;转而去处理这…

springboot优雅shutdown时异步线程安全优化

前面针对graceful shutdown写了两篇文章 第一篇&#xff1a; https://blog.csdn.net/chenshm/article/details/139640775 只考虑了阻塞线程&#xff0c;没有考虑异步线程 第二篇&#xff1a; https://blog.csdn.net/chenshm/article/details/139702105 第二篇考虑了多线程的安全…

Linux DNS配置文档

一、问题描述 1. 无法在浏览器通过域名访问百度&#xff1b; 2. 无法在终端 ping 通百度&#xff0c;例如&#xff1a;ping www.baidu.com 3. 可以 ping 通公网地址&#xff0c;例如&#xff1a;ping 114.114.114.114 或 ping 8.8.8.8 二、问题原因 域名解析 DNS 配置错误&am…

如何快速绘制logistic回归预测模型的ROC曲线?

临床预测模型&#xff0c;也是临床统计分析的一个大类&#xff0c;除了前期构建模型&#xff0c;还要对模型的预测能力、区分度、校准度、临床获益等方面展开评价&#xff0c;确保模型是有效的&#xff01; 其中评价模型的好坏主要方面还是要看区分度和校准度&#xff0c;而区分…

C++初学者指南第一步---12.引用

C初学者指南第一步—12.引用 文章目录 C初学者指南第一步---12.引用1. 功能&#xff08;和限制&#xff09;1.1 非常量引用1.2 常量引用1.3 auto引用 2.用法2.1 范围for循环中的引用2.2 常量引用的函数形参2.3 非常量引用的函数形参2.4 函数参数的选择&#xff1a;copy / const…

62.WEB渗透测试-信息收集- WAF、框架组件识别(2)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;61.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;1&#xff09; 打开一个搜索引…

有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?!

有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?! 1 背景概述 最近协助一个小兄弟排查了某作业使用 sqoop 采集 oracle 数据的失败问题&#xff0c;问题现象&#xff0c;问题原因和解决方法都挺直观&#xff0c;但在此过程中发现了一个有趣的 Oracle JDBC 驱…

mechanize - 自动化与HTTP web服务器的交互操作

1、前言 随着自动化测试的普及与落地推广&#xff0c;出现了众多知名的自动化测试工具&#xff0c;如Selenium 、Robot Framework、Playwright等。本文将介绍一款在Python环境下的mechanize库&#xff0c;这个库能够模拟浏览器行为&#xff0c;支持发送HTTP请求、解析HTML页面和…

【2024.6.23】今日 IT 速递 | 亚布力创新年会热点新闻盘点

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Vue3+TypeScript项目实战——打造雨雪交加的智慧城市

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

leetcode 二分查找·系统掌握

题目&#xff1a; 题解&#xff1a; 在阶梯数达到某一值后已有的硬币数量就小于了阶梯可以装的硬币数量&#xff0c;根据题意可以使用~10~泛型查找出最后一个可以被填满的阶梯。对于这类型可以二分答案的题目关键在于二分答案的上下界&#xff0c;本题的下界就是1上界就是硬币…

内容安全复习 8 - 视觉内容伪造与检测

文章目录 研究背景内容伪造方法虚假人脸生成人脸替换属性编辑表情重演跨模态人脸编辑 伪造检测方法眨眼检测交互式人脸活体检测一些了解方法挑战 研究背景 图像内容篡改造成新闻报道的偏颇易导致社会和公共秩序的不安&#xff0c;对公共安全产生不良影响。 造成的影响&#x…

英伟达能保住全球市值第一的桂冠吗?

内容提要 《巴伦周刊》认为&#xff0c;英伟达市值的迅速上涨是该公司可能难以保持市值第一桂冠的关键原因。另一个担忧是&#xff0c;英伟达的崛起主要基于一项单一技术——为人工智能应用提供动力的芯片和平台。一些人担心&#xff0c;如果购买英伟达产品的公司无法从投资中…

Open MMLab 之 MMDetection框架

MMDetection框架入门教程&#xff08;完全版&#xff09;-CSDN博客 OpenMMLab MMDetection是商汤和港中文大学针对目标检测任务推出的一个开源项目&#xff0c;它基于Pytorch实现了大量的目标检测算法&#xff0c;把数据集构建、模型搭建、训练策略等过程都封装成了一个个模块…