【C++】 类与对象——流操作符重载,const成员函数

news2024/12/27 13:35:57

在这里插入图片描述

类与对象

  • 流操作符重载
    • 1 << 重载
    • 2 >> 重载
  • const 修饰
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

流操作符重载

流操作符功能
<<输出操作符
>>输入操作符

对于这两个操作符,我们如何做到重载呢???

1 << 重载

以我们先前完成的Date类为例:

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

如果我们想要实现类似内置类型输出的形式,就需要完成操作符的重载

cout << Date类 

我们先来一个简单的尝试,试试水

	void operator<<(ostream& out) {
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}

我们运行一下却出现了这样的报错,不匹配操作数
在这里插入图片描述

这是因为重载函数里面有两个参数(Date* this, ostream& out)
作为成员函数重载,this指针占据第一个参数,Date必须是左操作数!
而我们cout << d 左右参数当然不匹配,如果我们调换位置
在这里插入图片描述
发现可以了,但是这样十分不符合逻辑,cout 流向 a1 ???

那为了规避这个问题,我们就要把函数中参数的顺序改变,所以我们的重载就不能是成员函数。我们把重载<<作为全局函数来看呢
在这里插入图片描述
在这里插入图片描述
这时我们可以正确的输出了,但是代价是我们成员变量改为公有了,不然我们在重载<<函数无法访问成员变量,这就让我们这个类变得不够安全,所以这里使用友元来解决。
在这里插入图片描述
这里为了可以连续输出我们需要把函数返回值改为流,这里就可以完成连续输出。
在这里插入图片描述

2 >> 重载

与<<重载类似,设置友元,声明函数。

 istream& operator>>(istream& in, Date& d) {
	 cout << "请依次输入年月日:> ";
	 in >> d._year >> d._month >> d._day;
 }

需要注意的是日期的有效性检查。我们可以修改为:

 bool Date::checkInvalid() {
	 if (_year <= 0 || _month < 1
		 || _month>12 || _day<1
		 || _day>GetMonthDay(_year, _month)) {
		 return false;
	 }
	 else return true;
 }
 
 istream& operator>>(istream& in, Date& d) {
	 cout << "请依次输入年月日:> ";
	 while (1) {
		 in >> d._year >> d._month >> d._day;

		 if (!d.checkInvalid()) {
			 cout << "输入了非法日期,请重新输入:>";
		 }
		 else break;
	 }
	 return in;
 }

这样就做到了保证日期有效性的作用。

const 修饰

来看样例:

int main(){
	const Date a1(2024,2,21);
	a1.show();

	return 0;
}

这里会报错:
在这里插入图片描述
因为我们把a1对象的权限放大了:
在这里插入图片描述
所以需要加入const修饰:
在这里插入图片描述
对于一些只读的函数,我们可以都加上const 让代码鲁棒性更加强大。

对于前面的Date类我们就可以做出完善:

#include<iostream>
using namespace std;
class Date{

public:
	bool checkInvalid();
	// 获取某年某月的天数
	int GetMonthDay(int year, int month) const;
	//展示日期
	void show() const;
	// 全缺省的构造函数
	Date(int year = 1900, int month = 1, int day = 1);
	// 拷贝构造函数
    // d2(d1)
	Date(const Date& d);
	// 析构函数
	~Date();
	// 赋值运算符重载

    // d2 = d3 -> d2.operator=(&d2, d3)
	Date& operator=(const Date& d) const;

	// 日期+=天数
	Date& operator+=(int day); 
	// 日期+天数
	Date operator+(int day) const;
	// 日期-天数
	Date operator-(int day) const;
	// 日期-=天数
	Date& operator-=(int day);
	// 前置++
	Date& operator++();
	// 后置++
	Date operator++(int);
	// 后置--
	Date operator--(int);
	// 前置--
	Date& operator--();
	// >运算符重载

	bool operator>(const Date& d) const ;
	// ==运算符重载
	bool operator==(const Date& d) const;
	// >=运算符重载
	bool operator >= (const Date& d) const;
	// <运算符重载
	bool operator < (const Date& d) const;
	// <=运算符重载
	bool operator <= (const Date& d) const;
	// !=运算符重载
	bool operator != (const Date& d) const;
	// 日期-日期 返回天数
	int operator-(const Date& d) const;
	// 转换为字符串“ YYYY-MM-DD ”
	string toString() const;

	static Date fromString(const string& dateStr);

	friend ostream& operator<<(ostream& out, Date& d);
	friend istream& operator>>(istream& in, Date& d);



private:
	int _year;
	int _month;
	int _day;

};

ostream& operator<<(ostream& out, Date& d);
istream& operator>>(istream& in, Date& d);

这样就让我们的代码更加完美,避免出现权限的扩大了。

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

2024 AI 大模型全栈开发知识体系【LLM 技术栈】

2023 年最火的一件事莫过于以 ChatGPT 为代表的 AI 大模型的兴起与应用探索&#xff0c;这一年大模型领域可以说是百花齐放&#xff0c;很多人都惊叹其在各行各业带来的影响。 有很多人说&#xff0c;AI 相对于当年的区块链、元宇宙有过之而无不及。 甚至于 2024 年 sora 的推出…

Python学习-列表1

十二、列表1 1、创建列表及基本运算 1&#xff09;使用中括号&#xff0c;将所有准备放入列表中的元素&#xff0c;包裹起来&#xff0c;不同元素之间使用逗号分隔。 举例&#xff1a; [1,2,3,4,5]2&#xff09;列表可以容纳不同类型的数据。 举例&#xff1a; [1,2,3,4,5,…

ETL快速拉取物流信息

我国作为世界第一的物流大国&#xff0c;但是在目前的物流信息系统还存在着几大的痛点。主要包括以下几个方面&#xff1a; 数据孤岛&#xff1a;有些物流企业各个部门之间的数据标准不一致&#xff0c;难以实现数据共享和协同&#xff0c;容易导致信息孤岛。 操作繁琐&#x…

【论文阅读】【yolo系列】YOLO-Pose的论文阅读

Abstract 我们介绍YOLO-pose&#xff0c;一种无热图联合检测的新方法&#xff0c;基于流行的YOLO目标检测框架的图像二维多人姿态估计。 【现有方法的问题】现有的基于热图的两阶段方法是次优的&#xff0c;因为它们不是端到端可训练的&#xff0c;训练依赖于surrogate L1 loss…

常用的消息中间件RabbitMQ

目录 一、消息中间件 1、简介 2、作用 3、两种模式 1、P2P模式 2、Pub/Sub模式 4、常用中间件介绍与对比 1、Kafka 2、RabbitMQ 3、RocketMQ RabbitMQ和Kafka的区别 二、RabbiMQ集群 RabbiMQ特点 RabbitMQ模式⼤概分为以下三种: 集群中的基本概念&#xff1a; 集…

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备

逆向服务器用了三天的时间&#xff0c;但此时觉得一切都值&#xff0c;又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分&#xff0c;上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…

Linux常见基本指令

本文将详细的介绍Linux中各常见指令的用法&#xff0c;并且在每个指令都有使用样例。一共有以下指令&#xff1a; 1. man指令 2.目录基础指令&#xff1a;2.1 pwd指令、2.2 ls指令、2.3 cd指令 3.文件创建与删除&#xff1a;3.1 touch指令、3.2 mkdir指令、3.3 rmdir 指令 &…

FL Studio21.2.3更新哪些新功能?中文汉化版如何下载

FL Studio 21.2.3的更新会带来一些变化&#xff0c;这些变化主要集中在以下几个方面&#xff1a; 功能增强和改进&#xff1a;随着版本的更新&#xff0c;FL Studio可能会引入一些新的功能或改进现有功能。这些新功能可能包括新的音频处理工具、效果器、虚拟乐器或混音选项&am…

智慧公厕是什么?智慧公厕对智慧城市的意义

城市的信息化发展需要催化了智慧城市&#xff0c;公共厕所作为城市的重要民生设施&#xff0c;如何实现更高阶的信息化建设&#xff0c;成为一个重要课题。那么&#xff0c;智慧公厕是什么&#xff1f;为什么它对智慧城市的建设如此重要&#xff1f;本文以智慧公厕源头厂家广州…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff…

论软件测试工程师 重要性!

在生活中&#xff0c;我们常常会遇到以下几种窘迫时刻&#xff1a; 准备骑共享单车出行&#xff0c;却发现扫码开锁半天&#xff0c;车子都没有反应&#xff1b;手机导航打车&#xff0c;却发现地图定位偏差很大&#xff0c;司机总是跑错地方&#xff1b;买个水&#xff0c;却…

【日常聊聊】计算机专业必看的电影

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;电影推荐 方向二&#xff1a;技术与主题 方向三&#xff1a;职业与人生 结语 我的其他博客 前言 计算机…

搜维尔科技:OptiTrack探索人类与技术之间关系的开创性表演

另一种蓝色通过 OptiTrack 释放创造力 总部位于荷兰的当代舞蹈团因其探索人类与技术之间关系的开创性表演而受到广泛赞誉。该公司由富有远见的编舞家大卫米登多普创立&#xff0c;不仅利用技术作为探索的主题&#xff0c;而且将其作为表达故事的动态工具。 “我一直对文化与…

Arcgis小技巧【17】——如何修改ArcGIS中影像的背景颜色

一、问题分析 在ArcGIS中&#xff0c;有时候会遇到影像有背景色&#xff0c;看上去很不美观。 尤其在多个影像叠加的时候&#xff0c;更是会造成遮挡的问题。 二、解决办法 首先&#xff0c;用【识别】工具在背景色是点击一下&#xff0c;查看弹出的窗口&#xff0c;记住背景…

VMware ESXi 8.0的安装、配置、使用

VMware ESXi 8.0的安装、配置、使用 ESXi的安装与配置下载镜像安装网络配置 Web控制台的管理操作激活开启直通网络配置修改电源模式创建虚拟机 其他ESXI秘钥克隆虚拟机 ESXi的安装与配置 下载镜像 官网&#xff1a;https://www.vmware.com/ 文档&#xff1a;https://docs.vm…

基础小白快速入门Python----数组的概念

啥是数组&#xff1f; 数组是一中基础的数据结构&#xff0c;用来存储单个或者多个数据元素 并且。数组内的元素必须为同一种类型。 元素在数组中占据特定的位置&#xff0c;通常称为索引或下标。数组的索引从0开始&#xff0c;这意味着第一个元素的位置是0&#xff0c;第二…

CTFHub技能树web之RCE(二)

第五题&#xff1a;远程包含 根据题目&#xff0c;使用远程包含进行 打开phpinfo&#xff0c;可以看到allow_url_fopen和allow_url_include都是On&#xff0c;因此可以使用php://input&#xff0c;由于代码会检查file中的内容&#xff0c;因此不能够使用php://filter包含文件&a…

芯课堂 | 一种用于振荡器的修调电路

​ 高精度时钟产生器是数模混合集成电路及数字集成电路的主要模块。晶体振荡器供与工艺、电源电压和温度无关的稳定时钟&#xff0c;但它与集成电路工艺不兼容&#xff0c;同时有相对较高的成本&#xff0c;这样它的应用就受到了一些限制。随着CMOS集成电路工艺和SOC技术的…

Flink 在蚂蚁实时特征平台的深度应用

摘要&#xff1a;本文整理自蚂蚁集团高级技术专家赵亮星云&#xff0c;在 Flink Forward Asia 2023 AI 特征工程专场的分享。本篇内容主要分为以下四部分&#xff1a; 蚂蚁特征平台特征实时计算特征 Serving特征仿真回溯 一、蚂蚁特征平台 蚂蚁特征平台是一个多计算模式融合的高…

【机器学习】数据清洗之处理重复点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…