C++初阶日期类的实现
Posted Huang_ZhenSheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++初阶日期类的实现相关的知识,希望对你有一定的参考价值。
目录
1.获取某年某月的天数
//获取某年某月的天数
int GetMonthDay(int year,int month)
{
assert(month > 0 && month < 13);
static int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//闰年的2月是29天
if (month == 2 && (year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
return 29;
}
return monthDays[month];
}
2.全缺省构造函数
//全缺省的构造函数
Date(int year = 0, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
//判断日期是否合法
if (_year < 0
|| _month <=0 || _month >= 13
|| _day <= 0 || _day > GetMonthDay(_year,_month))
{
cout << _year << "/" << _month << "/" << _day << "->"<<"非法日期"<<endl;
}
}
3.赋值运算符重载
日期+=天数
//日期+=天数
Date& Date::operator+=(int day)
{
if (day < 0)
{
return *this -= -day;
}
_day += day;
//日期不合法,进位
while (_day > GetMonthDay(_year, _month))
{
_day -= GetMonthDay(_year, _month);
_month++;
if (_month == 13)
{
_year++;
_month = 1;
}
}
return *this;//出了作用域,d1还在
//赋用+
/**this = *this + day;
return *this;*/
}
日期+天数
//日期+天数
Date Date::operator+(int day)
{
/*Date tmp(*this);
tmp._day += day;
while (tmp._day > GetMonthDay(tmp._year, tmp._month))
{
tmp._day -= GetMonthDay(tmp._year, tmp._month);
tmp._month++;
if (tmp._month == 13)
{
tmp._year++;
tmp._month = 1;
}
}
return tmp;*/
//赋用+=
Date ret = *this;
ret += day;
return ret;
}
日期-天数
//日期-天数
Date Date::operator-(int day)
{
Date ret = *this;
ret -= day;
return ret;
}
日期-=天数
//日期-=天数
Date& Date::operator-=(int day)
{
if (day < 0)
{
return *this += -day;
}
_day -= day;
while (_day <= 0)
{
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
_day += GetMonthDay(_year, _month);
}
return *this;
}
前置++
//前置++
Date& Date::operator++()
{
//_day += 1;
日期不合法,进位
//if (_day > GetMonthDay(_year, _month))
//{
// _day -= GetMonthDay(_year, _month);
// _month++;
// if (_month == 13)
// {
// _year++;
// _month = 1;
// }
//}
//赋用
*this += 1;
return *this;
}
后置++
按正常的运算符重载规则,无法区分前置++和后置++重载
为了区分,这里做一个特殊处理,给后置++增加一个int参数,这样他们两个就构成函数重载
//后置++
Date Date::operator++(int)
{
Date tmp(*this);
*this += 1;
return tmp;
}
前置--
//前置--
Date& Date::operator--()
{
//赋用
*this -= 1;
return *this;
}
后置--
//后置--
Date Date::operator--(int)
{
Date tmp(*this);
*this -= 1;
return tmp;
}
日期-日期
//日期-日期
int Date::operator-(const Date& d)
{
Date max = *this, min = d;
int flag = 1;
if (*this < d)
{
max = d;
min = *this;
flag = -1;
}
int n = 0;
while (min != max)
{
min++;
n++;
}
return n*flag;
}
4.运算符重载
//>运算符重载
bool 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;
}
else
{
return false;
}
}
//==运算符重载
bool operator==(const Date& d)
{
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
//>=运算符重载
bool operator >= (const Date& d)
{
return *this > d || *this == d;
}
//<运算符重载
bool operator < (const Date& d)
{
return !(*this >= d);
}
//<=运算符重载
bool operator <= (const Date& d)
{
return !(*this > d);
}
//!=运算符重载
bool operator != (const Date& d)
{
return !(*this == d);
}
日期类的实现:Gitee
以上是关于C++初阶日期类的实现的主要内容,如果未能解决你的问题,请参考以下文章
C++初阶第九篇——string类(string类中一些常见接口的用法与介绍+string类的模拟实现)