C++初阶 日期类的实现(下)

这篇具有很好参考价值的文章主要介绍了C++初阶 日期类的实现(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、输入输出(>>,<<)重载的实现

1.1初始版

 1.2友元并修改

1.2.1简单介绍下友元

1.2.2修改

1.3>>重载

二、条件判断操作符的实现

2.1==操作符的实现

2.2!=操作符的实现

2.3>操作符的实现

2.4>=,<=,<操作符的实现

三、日期-日期的实现

四、下期预告


前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

一、输入输出(>>,<<)重载的实现

1.1初始版

我们先来试着重载<<(输出流),它的类型是ostream(output stream),也就是说,如果我们在类里面实现的话,我们只需要传递cout进去,因为有this指针的存在,我们可以少传一个值,然后再通过这个传递过去的cout将日期打印出来就行。

最后思考一下返回值,我们可以从cout<<a<<b<<endl这段语句看出输出流是支持连续传参的,也就是说它是有返回值的,仔细思考可以看出,它们最后都是流向了控制台面板然后输出出来,也就是说它们都流向了cout,所以我们的返回值就应该是cout。最好使用引用返回,和引用传参,因为这个参数对应的cout是个全局变量不会随着你函数作用域的结束而销毁。

第一次实现往往就实现成了这副模样

	ostream& operator<<(ostream& out)
	{
		out << _year << "-" << _month << "-" << _day<<endl;
		return out;
	}

逻辑没有问题,也确实可以实现,但是我们在具体使用的时候就会出现这样一个问题,没有与之相匹配的运算符,这是为什么?

原因其实很简单,在我们使用+=运算符时,我们只需要d1+=1;即可,这就等效于d1.operator+=(1);那么我们cout<<d1,就像是将cout作为第一个参数进行传递,这自然是不符合语法的,但这个时候我们只需要d1<<cout,就会等价于d1.operator<<(cout);就可以进行对应的流出。

C++初阶 日期类的实现(下),C++初阶,c++,算法,开发语言 d1<<cout:

C++初阶 日期类的实现(下),C++初阶,c++,算法,开发语言

 1.2友元并修改

1.2.1简单介绍下友元

如果以后得d1<<cout 那未免有点抽象,我还是更喜欢cout<<d1,这要如何解决呢,我先揭晓答案,在类中实现解决不了这个问题,为什么呢,因为在类中实现一个函数,它的第一个参数注定就是this指针   因此我们只能够尝试在类外面使用两个参数来解决这个问题,但这样的话就会涉及到一个问题,那就是类中private的成员是没法访问的,而直接把private去掉来解决这个问题就多少有点舍本逐末了。

这时候就可以介绍到友元,什么是友元呢,友元就是在类中声明一下需要友元的函数,并在前+friend,这就是友元,之后被友元的函数就可以使用类里面的私人成员,例如说,我有一个int sum(int a, int b)函数,我想要这个sum函数可以访问到我类里面的成员,那么我就可以在类中friend int sum(int a,int b);不过值得注意的一点是,类和类之间的友元,友元是单向的,我把你看作是我的朋友,可你不一定把我当你的朋友   例如你有两个类,一个叫Date,一个叫test,你在Date里面friend class Date 那么在Date中就可以访问到test对象的私有成员,但test不可以访问到Date的私有成员。

1.2.2修改

有了友元之后我们的修改便只需要在类外面把我们的函数写好后,再在Date类中使用友元扩大我们函数的权限即可

C++初阶 日期类的实现(下),C++初阶,c++,算法,开发语言

1.3>>重载

有了前面的基础,这个的实现自然是手到擒来的

C++初阶 日期类的实现(下),C++初阶,c++,算法,开发语言

二、条件判断操作符的实现

2.1==操作符的实现

三个参数都相同就相同,即年月日都相等就相等

	bool operator==(Date& d1)
	{
		return (_year == d1._year) && (_month == d1._month) && (_day == d1._day);
	}

2.2!=操作符的实现

复用一下==操作符即可

bool operator!=(Date& d1)
	{
		return !((*this) == d1);
	}

2.3>操作符的实现

先将大于的全都判断完,剩下的就一定是小于或者等于,也就是false,顺着这个思路写

	bool operator>(Date& d1)
	{
		if (_year > d1._year)
		{
			return true;
		}
		if(_year==d1._year&&_month>d1._month)
		{
			return true;
		}
		if (_year == d1._year && _month == d1._month && _day > d1._day)
		{
			return true;
		}
		return false;
	}

2.4>=,<=,<操作符的实现

这三个操作符均可以通过复用实现,这里就不再赘述。

	bool operator>=(Date& d1)
	{
		return (*this) > d1 || (*this) == d1;
	}
	bool operator<(Date& d1)
	{
		return !((*this) >= d1);
	}
	bool operator<=(Date& d1)
	{
		return !((*this) > d1);
	}

三、日期-日期的实现

目标:计算出两个日期之间差了多少天

采用的方法是先获得两个日期分别的年份,通过年份的间隔来计算这两个年份之间差了多少天,比方说2023.11.2和2020.10.1,后面的月和日先忽略,只计算2023年和2020年之间差了多少天。

然后创建两个年份对应的初始日期,继续拿上面的例子来说,创建的两个初始日期就是2023.1.1和2020.1.1然后通过++的方式计算出和原日期之间的差值。

最后的结果就是年份之间差的天数+小的年份和对应原日期的差距-大的年份和对应原日期的差距,如果是小的减大的就交换下变量,并将公式换为 -(年份之间差的天数-小的年份和对应原日期的差距+大的年份和对应原日期的差距)这个可以用flaw实现

int operator -(Date d2)
	{
		int big_year = _year;
		int small_year = d2._year;
		int sum = 0; int flaw = 1;
		if (*this < d2)
		{
			int tmp = big_year;
			big_year = small_year;
			small_year = tmp;
			flaw = -1;
		}
		Date d1_cp(_year,1,1);
		Date d2_cp(d2._year,1,1);
		while (small_year != big_year)
		{
			sum += GetYearDay(small_year);
			small_year++;
		}
		int a1 = 0; int a2 = 0;
		while (d1_cp != (*this))
		{
			d1_cp++;
			a1++;
		}
		while (d2_cp != d2)
		{
			d2_cp++;
			a2++;
		}
		if(flaw==1)
		return sum + a1 - a2;
		else
			return -(sum-a1+a2);
	}

测试:

C++初阶 日期类的实现(下),C++初阶,c++,算法,开发语言

C++初阶 日期类的实现(下),C++初阶,c++,算法,开发语言

四、下期预告

类和对象就这样讲完了,下回我们来讲一下C++的内存管理QAQ

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:腾讯云自媒体分享计划 - 腾讯云开发者社区-腾讯云文章来源地址https://www.toymoban.com/news/detail-758729.html

到了这里,关于C++初阶 日期类的实现(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++初阶-vector类的模拟实现

    C++ STL中的vector就类似于C语言当中的数组,但是vector又拥有很多数组没有的接口,使用起来更加方便。 相比于STL中的string,vector可以定义不同的数据类型。 迭代器的本质可以暂时看作是指针,模拟实现vector,需要定义三个指针:指向起始位置_start,指向最后一个有效元素的下

    2024年02月04日
    浏览(152)
  • 【C++】日期类的实现

    .h 日期类的拷贝构造,析构,复制重载用默认生成的就行。 注意缺省参数在声明和定义 只能出现一处 ,GetMonthDay函数在后面讲解。 注意两点: 1)创建数组要创建13个位置,因为要对应“0月”。 2)因为要多次调用,所以设置成 内敛函数 能传引用就传引用, 提高效率(减少

    2023年04月08日
    浏览(26)
  • 【C++初阶】9. string类的模拟实现

    string类的完整实现放这里啦!快来看看吧 string类的作用就是将字符串类型实现更多功能,运算符重载,增删改查等等操作,所以其成员就包含char*的字符串 在之前的学习过程中,我们了解到类中存在的六个默认函数,其中就包含默认构造函数,那么对于string类是否需要用户自

    2024年02月09日
    浏览(34)
  • 【C++初阶】学习string类的模拟实现

    前面已经学习了string类的用法,这篇文章将更深入的学习string类,了解string类的底层是怎么实现的。当然,这里只是模拟一些常用的,不常用的可以看文档学习。 我们一共创建两个文件,一个是test.cpp文件,用于测试;另一个是string.h文件,用于声明和定义要模拟的string类。

    2024年02月03日
    浏览(52)
  • 【C++初阶】第八站:string类的模拟实现

    目录 string类的模拟实现 经典的string类问题 浅拷贝 深拷贝 写时拷贝(了解) 构造函数 string的全缺省的构造函数: string的拷贝构造函数 传统写法 现代写法 string的赋值重载函数 传统写法 现代写法 string的无参构造函数: 遍历函数 operator[ ] 迭代器 迭代器的底层实现begin和end:

    2024年04月28日
    浏览(39)
  • 『C++成长记』日期类的实现

    🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、日期类的实现 📒1.1日期类功能 📒1.2拷贝日期 📒1.3重载关系运算符 📒1.4重载+、+= 📒1.5重载 -、-= 📒1.6重载++、--      通过前面的知识,我们要实现

    2024年02月03日
    浏览(34)
  • 【C++深入浅出】日期类的实现

    目录 一. 前言  二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 +/- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整代码          通过前面两期类和对象的学习,我们已经对C++的类有了一定的了解。本期我

    2024年02月07日
    浏览(55)
  • 【C++类和对象】日期类的实现

    hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥 个人主页 :大耳朵土土垚的博客 💥 所属专栏 :C++入门至进阶 这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖 通过下面的学习我们将构建简单日期计算器的各种

    2024年04月23日
    浏览(50)
  • 【C++初阶】STL详解(二)string类的模拟实现

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 注:为了防止与标准库当中的string类产生命名冲

    2024年02月05日
    浏览(54)
  • C++类与对象基础(5)——日期类的实现

           对于实现日期类中需要用到的例如:构造函数,析构函数,运算符重载等内容,已经在前面几篇文章中进行介绍,故本文只给出关于类和对象中日期类的代码实现,对于代码的原理不给予详细的解释:  

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包