前言:本文将介绍Date类的具体实现,通过日期类的简单实现帮助我们完整复习一遍类的“六大默认成员函数”。
class Date
{
public:
// 获取某年某月的天数
int GetMonthDay(int year, int month);
// 全缺省的构造函数
Date(int year=1988, int month=1, int day=1);
// 拷贝构造函数
Date(const Date& d);
// 赋值运算符重载
// d2 = d3 -> d2.operator=(&d2, d3)
Date& operator=(const Date& d);
// 日期+=天数
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);
//定义一个函数打印看看
void print()
{
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
这里考虑下闰年的情况,然后用数组简单映射下就好了
int Date::GetMonthDay(int year, int month)
{
//记录每月天数
int Month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//遇见闰年,二月天数置29
if (month == 2 && ((year %4 == 0 && year % 100 != 0) || (year % 400 == 0))) return 29;
return Month[month];
}
Date::Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
//检测下日期是否合法
if (month < 1 || month>12 || day<0 || day>GetMonthDay(year,month)) cout << "非法日期" << endl;
}
Date::Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
类体外定义是成员函数返回值类型+类名::函数名(形参列表)
Date& Date:: operator=(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
return *this; //这个可不能少,少了遇上连续赋值语句a=b=c会出错。
}
考虑越界情况
_day
加了整数以后,<=该月最大天数,则不需要修改,直接返回该日期._day
加了整数以后,>该月最大天数,则_day
减去新的月所拥有的最大天数,然后该月加1,._day
仍大于新的月所拥有天数,继续执行第二步,并且循环.Date& Date:: operator+=(int day)
{
//先把加的天数算进来
_day += day;
//考虑加了这个天数之后,_day是否合法,不合法就给他转一下
while (_day > GetMonthDay(_year, _month))
{
_day -= GetMonthDay(_year, _month);
_month++;
if (_month == 13)
{
_month = 1;
_year++;
}
}
return *this;
}
复用!!!
Date Date::operator+(int day)
{
//+和+=区别无非就是一个返回的是运算之后的结果,一个返回的是运算之前的结果
Date tmp(*this);
*this += day;
return tmp;
}
考虑越界情况,与+=同理
Date& Date::operator-=(int day)
{
_day -= day;
while (_day < 1)
{
_month--;
if (_month < 1)
{
_month = 12;
_year--;
}
_day += GetMonthDay(_year, _month);
}
return *this;
}
复用!!!
Date Date::operator+(int day)
{
//+和+=区别无非就是一个返回的是运算之后的结果,一个返回的是运算之前的结果
Date tmp(*this);
*this += day;
return tmp;
}
复用!!!
Date Date::operator-(int day)
{
Date tmp(*this);
*this -= day;
return tmp;
}
复用!!!
Date& Date::operator++()
{
*this += 1;
return *this;
}
复用!!!
Date& Date::operator--()
{
*this -= 1;
return *this;
}
复用!!!
Date& Date::operator--(int) //这个int用于区分前置还是后置
{
Date tmp(*this);
*this -= 1;
return tmp;
}
复用!!!
Date& Date::operator++(int) //这个int用于区分前置还是后置
{
Date tmp(*this);
*this += 1;
return tmp;
}
bool Date::operator>(const Date& d)
{
if (_year > d._year) return true;
else if (_year == d._year && _month > d._month) return true;
else if (_year == d._year && _month == d._month && _day > d._day) return true;
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)
{
if (!(*this >= d)) return true;
return false;
}
复用!!!
bool Date::operator<=(const Date& d)
{
if (!(*this > d)) return true;
return false;
}
复用!!!
bool Date::operator!=(const Date& d)
{
return !(*this == d);
}
直接从小的日期开始,通过while循环往上加,然后计数,直到等于大的日期为止。
计数结束时,所计的数字便是我们想要的间隔天数。
int Date::operator-(const Date&d)
{
Date max(*this);
Date min(d);
int n = 1;
if (max < min)
{
Date tmp(max);
max = min;
min = tmp;
n = -1;
}
int count = 0;
while (min<=max)
{
count++;
min++;
}
return count*n;
}
学以致用一波,精心为大家准备了几道日期类编程题,不妨练练手,完全相似的哦!!!
感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_48953972/article/details/121221206
内容来源于网络,如有侵权,请联系作者删除!