您的位置:首页 > 其它

日期类完善版

2015-11-19 14:02 447 查看
书写一个日期类,重点:能完成日期加天数推算功能;能完成两个日期相减计算差多少天;

#pragma once
#include<iostream>
using namespace std;
class Date
{
private:
int _year;
int _month;
int _day;
public:
//默认成员函数
Date(int year = 1900, int month = 1, int day = 1);//缺省构造函数
Date(const Date& c);//拷贝构造函数
Date& operator=(const Date& c);//赋值操作符重载
~Date();//析构函数
void display();
friend int  GetMonthDay(int year, int month);//获得当月天数
friend ostream& operator<<(ostream& out,Date& d);//重载<<
friend istream& operator>>(istream& in,Date& d);//重载>>
Date operator+(int day);//日期对象加上一个天数
Date operator-(int day);//日期对象减上一个天数
int  operator-(Date  d);//两个日期对象相减求天数
Date& operator++();//日期前置++
Date operator++(int);//日期后置++
Date AddOne(const Date& d);//日期加一天
Date& operator+=(int day);//日期对象加等
Date& operator-=(int day);//日期对象减等

bool operator<(const Date& d);//比较*this对象是否比d日期对象小
bool operator>(const Date& d);//比较*this对象是否比d日期对象大
bool operator==(const Date& d);//比较*this对象与d日期对象是否相等
bool operator<=(const Date& d);//比较*this对象是否比d日期对象小于等于
bool operator>=(const Date& d);//比较*this对象是否比d日期对象大于等于
};
#include"Date.h"
Date::Date(int year, int month, int day)
{
if (year<1900)
{
cout << "year error" << endl;
return;
}
if (month <1 && month > 12)
{
cout << "month error" << endl;
return;
}
if (day<1 || day>GetMonthDay(year, month))
{
cout << "day error" << endl;
return;
}
//已确认日期有效
_year = year;
_month = month;
_day = day;
//cout << "构造函数" << endl;
}
Date::Date(const Date& c)
{
_year = c._year;
_month = c._month;
_day = c._day;
//cout << "拷贝构造" << endl;
}
Date& Date::operator=(const Date& c)//&表引用
{
if (this != &c)//&表取地址
{
_year = c._year;
_month = c._month;
_day = c._day;
}
//cout << "赋值" << endl;
return *this;
}
Date:: ~Date()
{
//cout << "析构函数" << endl;
}
void Date::display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
ostream& operator<<(ostream& out,Date& d)
{
d.display();
return out;
}
istream& operator>>(istream& in, Date& d)
{
cin >> d._year >> d._month >> d._day;
return in;
}
int  GetMonthDay(int year, int month)
{
int monthDay[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if ((year % 400 == 0 || year % 4 == 0 && year % 100 != 0) && month == 2)//是瑞年且2月
{
return monthDay[month - 1] + 1;
}
else
return  monthDay[month - 1];
}
Date Date::operator+(int day)//加类域::
{
Date tmp(*this);
if (day < 0)
{
return tmp - (-day);//加一个负天等于减一个正天
}
tmp._day += day;
while (tmp._day>GetMonthDay(tmp._year, tmp._month))//注意应是tmp对象和tmp._day比较
{
tmp._day -= GetMonthDay(tmp._year, tmp._month);
if (tmp._month == 12)
{
++tmp._year;
tmp._month = 1;
}
else
{
++tmp._month;
}
}
return tmp;
}
Date Date:: operator-(int day)
{
Date tmp(*this);
if (day < 0)
{
return tmp + (-day);//加一个负天等于减一个正天
}
tmp._day -= day;
while (tmp._day<1)//注意边界条件,一个月最小天数为1
{
if (tmp._month == 1)
{
--tmp._year;
tmp._month = 12;
}
else
{
--tmp._month;
}
tmp._day += GetMonthDay(tmp._year, tmp._month);
}
return tmp;
}
int Date:: operator-(Date  d)
{
int count = 0;
int flag = -1;
Date *pMax = &d;
Date *pMin = this;
Date tmp (*this);
if (*this > d)
{
flag = 1;
swap(pMax, pMin);
}
while (*pMin < *pMax)
{
++(*pMin);
++count;
}
if (flag == -1)
*this = tmp;//因为已修改this,需改回去
return flag*count;
}
Date& Date::operator++()
{
*this = *this + 1;
return *this;
}
Date Date:: operator++(int)
{
Date tmp(*this);
*this = *this + 1;
return tmp;
}
Date AddOne(const Date& d)
{
Date tmp(d);
tmp = tmp + 1;
return tmp;
}
Date& Date::operator+=(int day)
{
*this = *this + day;
return *this;
}
Date& Date::operator-=(int day)
{
*this = *this - day;
return *this;
}

bool Date::operator<(const Date& d)
{
if (_year<d._year)
{
return true;
}
else if (_year == d._year)
{
if (_month<d._month)
{
return true;
}
else if (_month == d._month)
{
if (_day<d._day)
{
return true;
}
}
}
return false;
}
bool Date:: operator>(const Date& d)
{
return !(*this < d);
}
bool Date::operator==(const Date& d)
{
return _year == d._year&&_month == d._month&&_day == d._day;
}
bool Date::operator<=(const Date& d)
{
return (*this < d) || (*this == d);
}
bool Date::operator>=(const Date& d)
{
return !(*this < d);
}
#include"Date.h"
void Test1()
{
/*Date d1(2005, 1, 1);
Date ret = d1 + 90;
ret.display();*/
/*Date d1(2005, 1, 1);
Date ret = d1 -1;
ret.display();*/
/*Date d1(2015, 11, 26);
Date d2(2015, 11, 25);
int ret = d1 - d2;
cout << ret << endl;*/

/*Date d1(2015, 4, 5);
Date d2;
cout<<(d1 > d2)<<endl;*/
/*cout<<(d1++);
cout << d1;*/
/*cout << "请输入选择:1.年份加天数2.两个年份相减.3.退出" << endl;
int input = 1;
while (1)
{
cout << "请输入:" << endl;
cin >> input;
switch (input)
{
case 1:
{
Date d;
int day = 0;
cout << "请输入日期:" << endl;
cin >> (cin, d);
cout << "请输入日期差" << endl;
cin >> day;
cout << (cout, (d + day));//或者cout<<(d+day);
break;
}
case 2:
{
Date d1, d2;
cout << "请输入第一个日期:" << endl;
cin >> (cin, d1);
cout << "请输入第二个日期:" << endl;
cin >> (cin, d2);
cout << (d1 - d2);
break;
}
case 0:
return;
default:
cout << "error" << endl;
return;
}
cout << "请继续选择" << endl;
}*/
}
int main()
{
Test1();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  日期类