热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++之日期类的实现之默认成员函数和运算符重载的综合应用(+、、=、<、>、+=、=)

在完成日期类时,涉及到对应月份天数的限制,先构造出下面的函数,用以判断当月天数。获取某一月的天数intDate::GetMonthDa

在完成日期类时,涉及到对应月份天数的限制,先构造出下面的函数,用以判断当月天数。

//获取某一月的天数
int Date::GetMonthDay(int year, int month)
{static int daysArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int days = daysArray[month];if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){days = 29;}return days;
}

Date.h文件

#pragma once
#include
using namespace std;
class Date
{
public:int GetMonthDay(int year, int month);void Print();Date(int year &#61; 1900, int month &#61; 1, int day &#61; 1);/*拷贝构造函数*/Date(const Date& d);// 赋值运算符重载// d2 &#61; d3 -> d2.operator&#61;(&d2, d3)Date& operator&#61;(const Date& d);// 析构函数~Date();//d1 &#43;&#61; 10Date& operator&#43;&#61;(int day);//d1 &#43; 10Date operator&#43;(int day);//d1 -&#61; 10Date& operator-&#61;(int day);//d1 - 10Date operator-(int day);//&#43;&#43;d1//d1.operator&#43;&#43;(&d1)Date& operator&#43;&#43;();//d1&#43;&#43;//d1.operator&#43;&#43;(&d1&#xff0c;0)//为了跟前置&#43;&#43;区分&#xff0c;加了一个参数&#xff0c;但是这个参数不使用Date operator&#43;&#43;(int);bool operator>(const Date& d);// &#61;&#61;运算符重载bool operator&#61;&#61;(const Date& d);// >&#61;运算符重载inline bool operator >&#61; (const Date& d);// <运算符重载bool operator < (const Date& d);// <&#61;运算符重载bool operator <&#61; (const Date& d);// !&#61;运算符重载bool operator !&#61; (const Date& d);// 日期-日期 返回天数int operator-(const Date& d);
private:int _year;int _month;int _day;
};

Date.cpp文件

#include"Date.h"//拷贝构造函数Date::Date(const Date& d)
{_year &#61; d._year;_month &#61; d._month;_day &#61; d._day;
}// 赋值运算符重载// d2 &#61; d3 -> d2.operator&#61;(&d2, d3)Date& Date::operator&#61;(const Date& d){if (this !&#61; &d){_year &#61; d._year;_month &#61; d._month;_day &#61; d._day;}return *this;}// 析构函数Date:: ~Date(){// 清理工作&#xff0c;Date类中没有需要清理的资源// 所以严格来说Date不需要写析构函数&#xff0c;因为我们不写&#xff0c;编译器默认生成就可以用cout << "~Date()" << endl;}//打印函数
void Date::Print()
{cout << _year << "-" << _month << "-" << _day << endl;
}//获取某一月的天数
int Date::GetMonthDay(int year, int month)
{static int daysArray[13] &#61; { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int days &#61; daysArray[month];if (month &#61;&#61; 2 && ((year % 4 &#61;&#61; 0 && year % 100 !&#61; 0) || (year % 400 &#61;&#61; 0))){days &#61; 29;}return days;
}
//判断日期是否非法Date::Date(int year, int month, int day)
{_year &#61; year;_month &#61; month;_day &#61; day;//cout <<"Date(int year,int month,int day)" <if (!(year >&#61; 0 && month > 0 && month < 13 && day > 0 && day < GetMonthDay( year, month))){cout << "日期非法" << endl;}}//d1 &#43;&#61; 10Date& Date::operator &#43;&#61; (int day)//赋值运算符重载的特点{if (day < 0){return *this -&#61; -day;}_day &#43;&#61; day;//日期是否合法while (_day > GetMonthDay(_year, _month)){_day -&#61; GetMonthDay(_year, _month);_month&#43;&#43;;if (_month &#61;&#61; 13){_year&#43;&#43;;_month &#61; 1;}}return *this;}//d1 &#43; 10//要实现&#43;&#xff0c;d1的值是不能被改变的&#xff0c;所以拷贝构造一个ret//ret为&#43;后的结果Date Date::operator&#43;(int day){//Date ret(*this);//拷贝构造//ret._day &#43;&#61; day;//while (ret._day > GetMonthDay(ret._year, ret._month))//{// ret._day -&#61; GetMonthDay(ret._year, ret._month);// ret._month&#43;&#43;;// if (ret._month &#61;&#61; 13)// {// ret._year&#43;&#43;;// ret._month &#61; 1;// }//}Date ret(*this);ret &#43;&#61; day;//直接调用&#43;&#61;&#xff0c;ret.operator(day)return ret;}//d1-&#61;dayDate& Date::operator-&#61;(int day){if (day < 0){return *this &#43;&#61; -day;}//日期是否合法_day -&#61; day;while (_day < 0){_day &#43;&#61; GetMonthDay(_year, _month);_month--;if (_month &#61;&#61; 0){_year--;_month &#61; 1;}}return *this;}//d1-dayDate Date::operator-(int day){Date ret(*this);ret -&#61; day;return ret;}//&#43;&#43;d1 等价于 d1 &#43;&#61; 1Date& Date::operator&#43;&#43;(){*this &#43;&#61; 1;//直接return *this;}//d1&#43;&#43;Date Date::operator&#43;&#43;(int){Date ret(*this);//要返回&#43;&#43;之前的值&#xff0c;所以先拷贝构造一个保存起来*this &#43;&#61; 1;return ret;//出了作用域就不存在了&#xff0c;不能用引用返回}// &#61;&#61;运算符重载bool Date :: operator&#61;&#61;(const Date& d){return _year &#61;&#61; d._year && _month &#61;&#61; d._month && _day &#61;&#61; d._day;}bool Date::operator>(const Date& d){if (_year > d._year){return true;}else if (_year &#61;&#61; d._year){if (_month > d._month){return true;}else if (_month &#61;&#61; d._month){if (_day > d._day){return true;}}}return false;}// >&#61;运算符重载bool Date::operator >&#61; (const Date& d){return (*this > d) || (*this &#61;&#61; d);}// <运算符重载bool Date::operator < (const Date& d){return !(*this >&#61; d);}// <&#61;运算符重载bool Date::operator <&#61; (const Date& d){return !(*this > d);}// !&#61;运算符重载bool Date::operator !&#61; (const Date& d){return !(*this &#61;&#61; d);}// 日期-日期 返回天数int Date::operator-(const Date& d)//函数名相同&#xff0c;参数不同&#xff0c;构成重载{//直接进行日期之间的相减很难Date max &#61; *this, min &#61; d;int flag &#61; 1;if (*this < d){max &#61; d;min &#61; *this;flag &#61; -1;}int n &#61; 0;while (min !&#61; max)//n 的数就是相差的天数{&#43;&#43;n;&#43;&#43;min;}return n*flag;}


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
author-avatar
用户x735b8j5iu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有