/******************************************************************************************
Date.hpp:
Copyright (c) Bit Software, Inc.(2013), All rights reserved.
Purpose:
声明并实现一个万年历类【腾讯面试题】
Author:
xxx
Created Time:
2015-4-26
******************************************************************************************/
class Time
{
public:
Time(int hour = 1)
{
_hour = hour;
}
Time(const Time& t)
{
_hour = t._hour;
}
Time& operator=(const Time& t)
{
this->_hour = t._hour;
return *this;
}
private:
int _hour;
};
class Date
{
public:
// 初始化列表进行初始化。
Date (int year = 1900, int month = 1, int day = 1, const Time& t = 1)
:_year(year)
,_month(month)
,_day(day)
,_t(t)
{}
Date (const Date& d)
:_year(d._year)
,_month(d._month)
,_day(d._day)
,_t(d._t)
{}
Date& operator=(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
_t = d._t;
return *this;
}
void Display ()
{
cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}
public:
//
// 比较日期的运算符重载
//
bool operator == (const Date& d)
{
return _year == d._year && _month == d._month
&& _day ==d._day;
}
bool operator != (const Date& d)
{
return _year != d._year || _month != d._month
|| _day !=d._day;
}
bool operator > (const Date& d)
{
if(_year>d._year )
{
return 1;
}
else if(_year<d._year )
{
return 0;
}
else
{
if (_month > d._month )
{
return 1;
}
else if (_month < d._month )
{
return 0;
}
else
{
if(_day > d._day )
{
return 1;
}
else
{
return 0;
}
}
}
return 0;
}
bool operator >= (const Date& d)
{
if(_year>d._year )
{
return 1;
}
else if(_year<d._year )
{
return 0;
}
else
{
if (_month > d._month )
{
return 1;
}
else if (_month < d._month )
{
return 0;
}
else
{
if(_day >= d._day )
{
return 1;
}
else
{
return 0;
}
}
}
return 0;
}
bool operator < (const Date& d)
{
if(_year<d._year )
{
return 1;
}
else if(_year>d._year )
{
return 0;
}
else
{
if (_month < d._month )
{
return 1;
}
else if (_month > d._month )
{
return 0;
}
else
{
if(_day < d._day )
{
return 1;
}
else
{
return 0;
}
}
}
return 0;
}
bool operator <= (const Date& d)
{
if(_year<d._year )
{
return 1;
}
else if(_year>d._year )
{
return 0;
}
else
{
if (_month < d._month )
{
return 1;
}
else if (_month > d._month )
{
return 0;
}
else
{
if(_day <= d._day )
{
return 1;
}
else
{
return 0;
}
}
}
return 0;
}
//
// 计算一个日期加减一个天数以后的日期。
//
int GetMonDay(int year,int month)
{
static int array[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))
{
array[2] = 29;
}
return array[month];
}
Date operator+(int day)
{
Date tmp(*this);
tmp._day += day;
while(tmp._day > GetMonDay(tmp._year,tmp._month))
{
tmp._day -= GetMonDay(tmp._year,tmp._month);
if(tmp._month ==12)
{
++tmp._year;
tmp._month = 1;
}
else
tmp._month ++;
}
return tmp;
}
Date operator-(int day)
{
Date tmp(*this);
tmp._day -= day;
while(tmp._day < 1)
{
if(tmp._month ==1)
{
tmp._month = 12;
tmp._year --;
tmp._day += 31;
}
else {
tmp._month --;
tmp._day += GetMonDay(tmp._year,tmp._month);
}
}
return tmp;
}
Date& operator-=(int day)
{
_day -= day;
while(_day < 1)
{
if(_month == 1)
{
_year--;
_month = 12;
_day += GetMonDay(_year,_month);
}
}
return *this;
}
Date& operator+=(int day)
{
_day += day;
while(_day > GetMonDay(_year,_month))
{
_day = _day - GetMonDay(_year,_month);
if(_month == 12)
{
_year++;
_month = 1;
}
else
{
_month++;
}
}
return *this;
}
const Date& operator++() // 前置++
{
_day++;
if(_day > GetMonDay(_year,_month))
{
if(_month == 12)
{
_year++;
_month = 1;
_day = 1;
}
else
{
_month++;
_day =1;
}
}
return *this;
}
Date operator++(int) // 后置++
{
Date tmp(*this);
_day ++;
if(_day > GetMonDay(_year,_month))
{
if(_month ==12)
{
_year++;
_month = 1;
_day =1;
}
else
{
_month ++;
_day =1;
}
}
return tmp;
}
const Date& operator--() // 前置--
{
_day--;
if(_day < 1)
{
if(_month == 1)
{
_year--;
_month = 12;
_day = 31;
}
else
{
_month--;
_day = GetMonDay(_year,_month);
}
}
return *this;
}
Date operator--(int) // 后置--
{
Date tmp(*this);
_day --;
if(_day < 1)
{
if(_month == 1)
{
_year--;
_month = 12;
_day = 31;
}
else
{
_month--;
_day = GetMonDay(_year,_month);
}
return tmp;
}
}
//
// 两个日期相加没有意义
// 计算两个日期相减以后的差的天数
//
int operator-(const Date& d)
{
if(*this > d)
{
Date d1 = d;//xiao
Date d2 =*this;//da
}
}
private:
int _year;
int _month;
int _day;
//const int _testConst;
//int& _testRef;
Time _t;
};
void TestDate()
{
Date d1(2015,1,1);
d1.Display ();
//Date d2(2015,8,18);
//d2.Display();
/*int ret = (d1==d2);
cout<<ret<<endl;
int ret = (d1!=d2);
cout<<ret<<endl;
int ret = (d1<=d2);
cout<<ret<<endl;*/
d1+=40;
d1.Display();
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/liuxiaoqian_/article/details/47983403