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

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

目录

一、前置准备

1.1获得每月的天数

1.2获得每年的天数

1.3构造函数,析构函数和拷贝构造函数

二、日期与天数的+,-,+=,-=实现

2.1+=运算符重载

2.2+运算符的实现

2.3-=运算符的实现

2.4-运算符的实现

三、++,--的实现

3.1前置++,后置++的实现

3.2前置--和后置--的实现

四、下期预告


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

一、前置准备

1.1获得每月的天数

每月的天数是一个很重要的东西,其中二月最为特殊,闰年的时候它是29,其余年份为28,我们可以使用数组的方式来进行操作,而这个数组的创建也是有讲究的,创建为13的长度最好。

因为数组的下标从0开始,而日期是从1开始的,如此我们若是想要月份和数组的下标一一对应,就得放弃一个空间,所以我们创建的长度为13,创建完数组之后第一个下标的值给0即可,从下一个下标的值开始给月份对应的天数,给完之后再在外面对闰年的情况单独处理一下,最后返回对应月份的天数就完成了。

	int GetMonthDay(int year, int month)
	{
		int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (_month == 2 && ((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0))
		{
			return 29;
		}
		return arr[month];
	}

1.2获得每年的天数

这个操作比之前更加简单,判断下是否是闰年即可,不多说,直接上代码

	int GetYearDay(int year)
	{
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
			return 366;
		return 365;
	}

1.3构造函数,析构函数和拷贝构造函数

这方面是很基本的,具体的实现过程我就不赘述了,如果有小伙伴不懂,可以去看看博主之前写的博客C++ 初阶 类和对象(中)-CSDN博客 C++初阶 类和对象(下)-CSDN博客

注意:构造函数构造的日期不一定合法,可以来个判断语句,若非法,中止程序

直接上代码

	Date(int year=1,int month=1,int day=1)
	//构造函数
	{
		if (year < 1 || month>12 || day > GetMonthDay(year, month))
		{
			cout << "日期非法,创建失败" << endl;
			exit(-1);//退出程序
		}
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date&d1)
	//拷贝构造函数
	{
		_year = d1._year;
		_month = d1._month;
		_day = d1._day;
	}
	~Date()
	//析构函数
	{
		_year = 0;
		_month = 0;
		_day = 0;
	}

二、日期与天数的+,-,+=,-=实现

2.1+=运算符重载

目标:实现一个日期+天数,日期被修改为过了多少天的日期

很多人第一次写会写成这样,而编译器报错是因为多了一个this指针过去,已经达到了三目运算符的操作了   因此我们只需要把Date d1去掉即可,但因为有this指针的存在,我们一样能对这个变量进行操作。

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

实现这个之前我们可以写一个GetMonthDay函数来获得没一月份的天数,值得注意的一点是闰年时2月为29日,接着我们来讲讲实现思路,我们的返回值最好设置成Date&型的,因为+=操作的目标出了函数作用域在main中依然存在,因此使用Date&类型的返回值可以令编译器的效率得到提高。

可以先在目标的_day上加上day,这样能方便之后的进位,比方说2023-11-16 +100就先处理成2023-11-116,之后通过GetMonthDay取得的具体进位数据来进行进位即可,这里就可以通过循环实现,当_day>GetMonthDay时意味着需要进位,因此可以以这个来作为循环是否继续的条件,之后的实现便只需要注意一些细节即可,比方说,月满12进1之类的。

	int GetMonthDay(int year, int month)
	{
		int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		//之所以是13是为了更加符合日期的返回,一月就返回数组下标为1的值
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
		{
			return 29;
		}
		return arr[month];
	}
	Date& operator +=(int day)
	{
		_day += day;
		while (_day > GetMonthDay(_year,_month))
		{
			_day -= GetMonthDay(_year, _month);
			_month++;
			if (_month>12)
			{
				_month = 1;
				_year++;
			}
		}
		return *this;
	}

测试: 

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

2.2+运算符的实现

有了+=运算符之后+运算符就很好操作了,复用一下就好 

使用临时变量的原因是因为,+运算符并不改变原来变量的值,比方说a=b+100;这里的b也不会被修改

	Date operator+(int day)
	{
		Date tmp(*this);
		tmp += day;
		return tmp;
	}

2.3-=运算符的实现

 这个实现起来和+=有着异曲同工之处,都可以先直接在对象的_day上-day,比方说2023-11-17-100,就直接先转换为2023-11-(-83),然后通过月份的进位来不断的令_day增加,直到_day大于0的时候循环停止并返回对应的内容即可。

注意:月份和天数在进行--的时候是不可能出现0的,大家应该都没听过0天,0月这种说法吧,因此在条件判断语句中应该要把0也考虑进去。

Date& operator-=(int day)
	{
		_day -= day;
		while (_day <= 0)
		{
			_day += GetMonthDay(_year, _month);
			_month--;
			if (_month <= 0)
			{
				_month = 12;
				_year--;
			}
		}
		return *this;
	}

测试:

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

2.4-运算符的实现

如+运算符一样简单的复用一下即可

	Date operator-(int day)
	{
		Date tmp(*this);
		tmp -= day;
		return tmp;
	}

三、++,--的实现

3.1前置++,后置++的实现

有了+=和+运算符之后做这步是很简单的,唯一需要注意的是后置++的那个++运算符在重载的时候参数中要多来个int,注意:前置++,先++后使用,后置++先使用后++

关于这方面更详细的讲解请看博主之前写的文章 

C++初阶 类和对象(下)-CSDN博客

	Date& operator++()
	//前置++,先++后使用
	{
		(*this) += 1;
		return *this;
	}
	Date operator++(int)
	//后置++,先使用后++
	{
		Date tmp(*this);
		*this += 1;
		return tmp;
	}

测试:

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

3.2前置--和后置--的实现

与++的实现几乎一样,不再赘述

	Date& operator--()
	{
		(*this) -= 1;
		return *this;
	}
	Date operator--(int)
	{
		Date tmp(*this);
		*this -= 1;
		return tmp;
	}

测试:

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

四、下期预告

内容有点多,博主就拆成两篇文章了,大概今晚发 文章来源地址https://www.toymoban.com/news/detail-755558.html

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

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

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

相关文章

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

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

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

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

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

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

    2024年02月03日
    浏览(39)
  • 【C++初阶】9. string类的模拟实现

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

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

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

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

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

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

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

    2024年04月23日
    浏览(42)
  • 【C++深入浅出】日期类的实现

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

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

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

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

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

    2024年02月02日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包