C++类和对象 练习小项目---日期类的实现.

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

C++类和对象 练习小项目---日期类的实现.,C++,c++,开发语言,c语言,算法

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:为了更好的理解C++类和对象的知识,我们可以动手实现一下C++的一个简单的日期类,完成相应的函数,更好的帮助我们理解类和对象.
金句分享:
✨无人问津也好,技不如人也罢✨
✨试着冷静下来,做自己该做的事!✨

前言

这是我们需要实现的日期类的接口声明,我们需要的是在Date.cpp文件中实现函数的定义.

class Date
{
public:

	// 获取某年某月的天数
	int GetMonthDay(int year, int month);
	//打印日期类函数
	void Print();
	// 全缺省的构造函数
	Date(int year = 1900, int month = 1, int day = 1);
	// 拷贝构造函数
	Date(const Date& d);
	// 赋值运算符重载
	Date& operator=(const Date& d);
	// 析构函数
	~Date();

	// 日期+=天数
	Date& operator+=(int day);
	// 日期+天数
	Date operator+(int day);
	// 日期-天数
	Date operator-(int day);
	// 日期-=天数
	Date& operator-=(int day);
	// 前置++
	Date& operator++();
	// 后置++
	Date operator++(int);
	// 后置--
	Date operator--(int);
	// 前置--
	Date& operator--();


	// >运算符重载
	bool operator>(const Date& d);
	// ==运算符重载
	bool operator==(const Date& d);
	// >=运算符重载
	bool operator >= (const Date& d);
	// <运算符重载
	bool operator < (const Date& d);
	// <=运算符重载
	bool operator <= (const Date& d);
	// !=运算符重载
	bool operator != (const Date& d);
	// 日期-日期 返回天数
	int operator-(const Date& d);

private:

	int _year;
	int _month;
	int _day;
};

一、构造函数

1.1 默认构造函数

声明:(在Date类中)

//Date.h
	// 全缺省的构造函数
	Date(int year = 2023, int month = 1, int day = 1);

定义:

//Date.cpp
Date::Date(int year , int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
	//这里也就体现出了,成员变量前面'_'的好处,方便与参数区分
}

这里需要注意的是,缺省参数应该在声明处给出,定义时不能有缺省参数,在C++入门章节牛牛有提到过原理.

1.2 拷贝构造函数

使用场景:

Date d1(2023, 4, 26);
Date d2(d1);//使用已存在的对象去初始化另一个对象,被称为拷贝构造

定义:

//Date.cpp
// 拷贝构造函数
Date::Date(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}

注意使用引用传参.

二、获取天数

放在以前,牛牛实现获取天数的函数可能会用一个很长的Switch case语句,然后返回每一个天数的时间.

如今,牛牛发现,除了闰年时2月是29天以外,其他时候,每个月的时间是不变的,我们可以使用数组将每个月的天数存起来.

int Date::GetMonthDay(int year, int month)
{
	int day[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))//如果是闰年,且是2月
	{
		day[2] = 29;
	}
	return day[month];
}

这里需要注意的是判断条件month == 2要放在前面
((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)放在后面,因为前面的判断条件很好判断,后面的比较复杂,这样可以提高效率.

三、运算符重载

3.1 赋值运算符重载

注意:
参数const Date& d

  1. const一方面保证右操作数不会被修改,即防止函数写反了功能.
    例如:参照错误写法.
    d1=d2,结果是将d2修改成了d1,偷鸡不成蚀把米.

  2. Date&传引用就不会调用拷贝构造函数去传参,减少拷贝,提高效率.

//运算符重载
Date& Date::operator=(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}
//错误写法
Date& Date::operator=(Date& d)
{
	d._year=_year; 
	d._month=_month;
	d._day=_day;
	return *this;
}

3.2 日期+=天数

C++类和对象 练习小项目---日期类的实现.,C++,c++,开发语言,c语言,算法
示例: 2023年7月28日+80天
C++类和对象 练习小项目---日期类的实现.,C++,c++,开发语言,c语言,算法

需要注意的是,如果month往后推一位后为13,则应当将month设置为1,并且year++.

代码实现:

// 日期+=天数
Date& Date:: operator+=(int day)
{
	if (day < 0)//不知道使用者会不会调皮传过来负数
	{
		return *this -= -day;//调用"-="的运算符重载
	}
	_day += day;
	while (_day > GetMonthDay(_year, _month))//如果超过当月天数
	{
		_day -= GetMonthDay(_year, _month);//通过调用GetMonthDay函数获取当月天数
		_month++;
		if (_month > 12)//月数超过12,则开始下一年
		{
			_month = 1;
			_year++;
		}
	}
	return *this;
}

3.3 日期+天数

日期+=天数不同,日期+天数要求该日期本身没有改变,而是返回日期+天数后的日期

此时,我们需要创建一个临时Dateret,将增加的天数ret进行计算,最后返回ret对象.

// 日期+天数

Date Date:: operator+(int day)
{
	if (day < 0)
	{
		return *this -= -day;//调用"-="的运算符重载
	}
	Date ret;//创建临时对象
	ret._day += day;
	while (ret._day > GetMonthDay(_year, _month))//如果超过当月天数
	{
		ret._day -= GetMonthDay(_year, _month);
		ret._month++;
		if (ret._month > 12)
		{
			ret._month = 1;
			ret._year++;
		}
	}
	return ret;
}

3.4 日期-=天数 和 日期-天数

C++类和对象 练习小项目---日期类的实现.,C++,c++,开发语言,c语言,算法

示例:2023年7月28日-100天

需要注意的是,重点是+上月的天数,而不是本月的天数.
C++类和对象 练习小项目---日期类的实现.,C++,c++,开发语言,c语言,算法

 // 日期-=天数

Date& Date:: operator-=(int day)
 {
	 if (day < 0)
	 {
		return *this += -day;//调用"+="的运算符重载
	 }
	 _day -= day;
	 while (_day <= 0)//如果是负数
	 {
		 _month--;
		 if (_month <= 0)
		 {
			 _month = 12;
			 _year--;
		 }
		 _day += GetMonthDay(_year, _month);
	 }
	 return *this;
 }

到了这里,我想日期-天数的实现应该比较简单,牛牛就不多介绍了.

// 日期-天数

 Date Date::operator-(int day)
 {
	 if (day < 0)
	 {
		 *this -= day;//调用"-="的运算符重载
	 }
	 Date ret;
	 ret._day -= day;
	 while (ret._day <= 0)//如果是负数
	 {
		 ret._day += GetMonthDay(_year, _month-1);//+上个月的总天数
		 ret._month--;
		 if (ret._month <=0)
		 {
			 ret._month = 12;
			 ret._year--;
		 }
	 }
	 return ret;
 }

3.5 日期-日期

C++类和对象 练习小项目---日期类的实现.,C++,c++,开发语言,c语言,算法
日期-日期怎么计算?
例如:
2023年7月28号距离2024年1月1号还有几天?
如果对应的年月日进行想减,然后还需要计算是那些年有那些天,月数又有几天,那可就太麻烦了吧.

所以我们直接先判断两个日期的大小,选择用较小的日期,对齐进行++操作,直到与较大的相等,统计++了多少天,这样是不是就很简单了?
步骤:

  1. 比较日期大小,选出较小者.
  2. 对较小者进行++并统计,直到与较大者相等.
  3. 返回统计的天数.
// 日期-日期 返回天数
int Date::operator-(const Date& d)
{
	//小的日期一直++,加到和大的日期一样时,加了多少次就差多少天
	Date max = *this;
	Date min = d;
	int flag = 1;
	
	if (*this < d)//如果是左操作数小,则应当是负数
	{
		max = d;
		min = *this;
		flag = -1;
	}
	int n = 0;
	while (min != max)//用n统计相差多少天
	{
		++min;
		++n;
	}
	return n * flag;
}

3.6 前置++与后置++

前置++后置++实现的时候有一个很尴尬的问题,因为前置++和后置++都是单目运算符,即只有一个操作数,那么为了实现他们两个函数能够重载,则只能在后置++处添加一个int类型的参数.
这个参数用户在使用时不需要传递,编译器会自动传递,本质是为了让前置++和后置++进行函数重载.

前置++是返回+1之后的结果,并且this是指向对象本身的,所以我们可以使用传引用返回,减少拷贝,提高效率.

后置++是返回+1之前的值,并且对象最终还需要被修改,所以我们需要创建一个临时对象用于记录+1前对象的日期大小.除此之外,因为临时变量是在局部定义的,所以我们必须传值返回,不能传引用返回.

// 前置++
 Date& Date:: operator++()
{
	 _day +=1;
	 while (_day > GetMonthDay(_year, _month))//如果超过当月天数
	 {
		 _day -= GetMonthDay(_year, _month);//则减去当月的天数
		 //月份向后推一个月
		 _month++;
		 if (_month > 12)
		 {
			 _month = 1;
			 _year++;
		 }
	 }
	 return *this;
}

// 后置++
Date Date::operator++(int)//这个参数为了个与前置++构成函数重载,调用的时候不需要传参.
{
	Date tmp = *this;//要保存++前日期的大小.
	_day += 1;
	while (_day > GetMonthDay(_year, _month))//如果超过当月天数
	{
		_day -= GetMonthDay(_year, _month);
		_month++;
		if (_month > 12)
		{
			_month = 1;
			_year++;
		}
	}
	return tmp;
}

3.7 前置–与后置–

学了前置++与后置++,这里也是类似的,需要注意的是,+上月的天数.

// 前置--

Date& Date::operator--()
{
	_day -= 1;
	while (_day <= 0)//如果是负数
	{
		_day += GetMonthDay(_year, _month - 1);//+上个月的总天数
		_month--;
		if (_month <= 0)
		{
			_month = 12;
			_year--;
		}
	}
	return *this;
}
// 后置--
Date Date::operator--(int)
{
	Date tmp = *this;
	_day -= 1;
	while (_day <= 0)//如果是负数
	{
		_day += GetMonthDay(_year, _month - 1);//+上个月的总天数
		_month--;
		if (_month <= 0)
		{
			_month = 12;
			_year--;
		}
	}
	return tmp;
}

3.8 比较运算符

比较运算符重载我不多介绍了,没有什么难度.

需要学习的是,可以使用已经实现的>和"=="去复用实现剩下的其他运算符

bool Date::operator>(const Date& d)
{
	if (_year > d._year)//如果年大
	{
		return true;
	}
	{
		if (_year == d._year)
		{
			if (_month > d._month)//年相同,月大
			{
				return true;
			}
			else
			{
				if (_day > d._day)//入如果年月相同,日大
				{
					return true;
				}
				return false;//月小,或者日小和相等
			}
		}
		return false;//如果年小
	}
}

// ==运算符重载

bool Date::operator==(const Date& d)
{
	if (_year == d._year&&
		_month== d._month&&
		_day==d._day
		)
	{
		return true;
	}
	return false;
}

// >=运算符重载
bool Date::operator >= (const Date& d)
{
	if (*this > d|| *this == d)
	{
		return true;
	}
	return false;
}

// <运算符重载
bool Date::operator < (const Date& d)
{
	return !(*this >= d);
}

// <=运算符重载
bool Date::operator <= (const Date& d)
{
	return !(*this > d);
}

// !=运算符重载
bool Date::operator != (const Date& d)
{
	return !(*this == d);
}

日期类就简单实现到这里了,友友们下次见,总代码,可以去我的资源处下载源代码哦.文章来源地址https://www.toymoban.com/news/detail-623900.html

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

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

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

相关文章

  • C++类与对象基础(5)——日期类的实现

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

    2024年02月02日
    浏览(50)
  • C++初阶--类与对象--const成员和日期类的实现

    将const修饰的成员函数称之为const成员函数。 在一个成员函数里面,对于this指针指向的对象,是隐藏式的,没有办法用常规的方法去修饰它,所以我们是这样进行修饰的: 注意事项: date.h date.cpp 这里采用多文件编程的方式,所以在date.cpp中,是在Date类外使用的,需要加上作

    2024年02月05日
    浏览(49)
  • C++ 类和对象篇(一) 类的引入

    目录 一、类的概念 二、类的引入 三、类的定义  1.在C++中定义一个类 2.struct 和 class 的区别 3.成员函数的声明与定义 四、封装及类的访问限定符 1.封装 2.类的访问限定符        五、类的作用域和生命周期 六、类的实例化 0. 概念 1. 隐式创建 2. 显式创建 3. 显式new创建 七、

    2024年02月14日
    浏览(35)
  • 【C++】类和对象详解(类的使用,this指针)

    提示:这里可以添加本文要记录的大概内容: 在计算机编程领域,程序设计的方法论不断演化,从最初的面向过程到如今更为强大而灵活的面向对象。本文将深入探讨C++中关于类和对象的概念,为读者提供对面向对象编程的深刻理解。 提示:以下是本篇文章正文内容,下面

    2024年02月02日
    浏览(41)
  • 【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针

    🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、类的作用域  二、类的实例化 三、类对象模型  四、this指针 1、this指针的引出  2 this指针的特性 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定

    2024年04月15日
    浏览(46)
  • C++类和对象练习

    要求: (1)包含成员变量 m_a(立方体边长)。 (2)包含函数 SetA(doublea)(设置立方体边长)、GetVolume()(计算体积)、GetArea()(计算表面积)。 (3)包含函数 Display(),用来输出计算的结果。 (4)设计测试用主函数 main(),用来测试 Box 类。 包括: (1)普通数据成员:姓

    2023年04月18日
    浏览(39)
  • 【C++深入浅出】类和对象上篇(类的基础、类的模型以及this指针)

    目录 一. 前言  二. 面向对象与面向过程         2.1 面向过程         2.2 面向对象 三. 类的基础知识 3.1 类的引入 3.2 类的定义 3.3 成员变量的命名规则 3.4 封装 3.5 类的访问限定符 3.6 类的作用域 3.7 类的实例化 四. 类的对象模型 4.1 类对象的大小 4.2 类对象的存储方式 4.3 空

    2024年02月10日
    浏览(56)
  • C++核心编程—类和对象,类的三大特性——封装、继承、多态

    纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 ①什么是对象? 生活中有各种各样的 事物 ,如人、动物、植物等在C++中将这些称为对象。 对象多种多样, 各种对象的属性也不相同 。 例如狗的品种,毛色,年龄等 各个对象都有自己的行为 ,例

    2024年02月07日
    浏览(64)
  • 【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数

    目录 前言 类的6个默认成员函数 构造函数 概念 特性 析构函数  概念 特性 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类成员函数 取地址及const取地址操作符重载 本章总结:         有时候我们写好了一个栈,头脑中第一件事

    2024年02月20日
    浏览(44)
  • 【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)

    欢迎各位小伙伴关注我的专栏,和我一起系统学习C++,共同探讨和进步哦! 学习专栏 : 《进击的C++》 C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象

    2024年02月03日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包