c++日期类

下面的日期类主要实现的功能有
1.日期类的四大默认成员函数:构造函数,拷贝构造函数,赋值操作符重载,析构函数
2.输入操作符重载,输出操作符重载
3.日期的比较
4.日期+天数
5.日期-天数
6.日期-日期

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
using namespace std;

class Date
{
    friend ostream& operator<<(ostream &io, const Date& d);
    friend istream& operator>>(istream &is, Date& d);
public:
    //4个默认的成员函数 
    //构造、拷贝构造、赋值语句重载、析构函数 
    Date(int year, int month, int day);
    Date(const Date& d);
    ~Date();
    Date& operator=(const Date& d);
public:
    //日期比较 
    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);
public:
    Date& operator++();
    Date operator++(int);
    Date& operator--();
    Date operator--(int);
    //日期+天数 
    Date& operator+(int day);
    //日期-天数 
    Date& operator-(int day);
    //日期-日期 
    int operator-(Date& d);
public:
    bool isLeapYear(const Date&d)
    {
        if ((d._year % 4 == 0) || (d._year % 400 == 0 && d._year % 100 == 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
public:
    int GetMonthDay(const Date& d);  //得到本月的天数
    Date GetNextMonthDay(Date& d);  //得到下一个月的天数
    Date GetUpMonthDay(Date& d);    //得到上一个月的天数
private:
    int _year;//年 
    int _month;//月 
    int _day;//日 
};
Date Date::GetNextMonthDay(Date& d)
{
    if (d._month + 1 == 13)
    {
        d._month = 1;
    }
    else
    {
        d._month += 1;
    }
    return d;

}
Date Date::GetUpMonthDay(Date& d)
{
    if (d._month - 1 == 0)
    {
        d._month = 12;
    }
    else
    {
        d._month -= 1;
    }
    return d;
}
int Date::GetMonthDay(const Date& d)
{
    switch (d._month)
    {
    case 1:
        return 31;
        break;
    case 2:
    {
              if (isLeapYear(d))
              {
                  return 29;
              }
              else
              {
                  return 28;
              }
    }
        break;
    case 3:
        return 31;
        break;
    case 4:
        return 30;
        break;
    case 5:
        return 31;
        break;
    case 6:
        return 30;
        break;
    case 7:
        return 31;
        break;
    case 8:
        return 31;
        break;
    case 9:
        return 30;
        break;
    case 10:
        return 31;
        break;
    case 11:
        return 30;
        break;
    case 12:
        return 31;
        break;
    default:
        break;
    }
}

ostream &operator<<(ostream &io, const Date& d)
{
    io << d._year << "-" << d._month << "-" << d._day;
    return io;
}
istream &operator>>(istream& is, Date&d)
{
    is >> d._year >> d._month >> d._day;
    return is;
}

Date::Date(int year,int month,int day)
:_year(year)
, _month(month)
, _day(day)
{
    //cout << "Date(int year,int month,int day)" << endl;
}
Date::Date(const Date& d)
{
    this->_year = d._year;
    this->_month = d._month;
    this->_day = d._day;
    //cout << "Date(const Date& d)" << endl;
}
Date::~Date()
{
    //cout << "~Date()" << endl;
}
Date& Date::operator=(const Date& d)
{
    if (*this != d)
    {
        this->_year = d._year;
        this->_month = d._month;
        this->_day = d._day;
    }
    //cout << "operator=(const Date& d)" << endl;

    return *this;
}

bool Date::operator==(const Date& d)
{
    if ((this->_year == d._year) && (this->_month == d._month) && (this->_day == d._day))
    {
        return true;
    }
    return false;
}
bool Date::operator!=(const Date& d)
{
    if (*this == d)
    {
        return false;
    }
    return true;
}
bool Date::operator>(const Date& d)
{
    if (this->_year == d._year)
    {
        if (this->_month == d._month)
        {
            if (this->_day == d._day)
            {
                return false;
            }
            else if (this->_day > d._day)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (this->_month > d._month)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else if (this->_year > d._year)
    {
        return true;
    }
    else
    {
        return false;
    }
}
bool Date::operator>=(const Date& d)
{
    if ((*this == d) || (*this>d))
    {
        return true;
    }
    else
    {
        return false;
    }
}
bool Date::operator<(const Date& d)
{
    if (*this==d)
    {
        return false;
    }
    else if (*this > d)
    {
        return false;
    }
    else
    {
        return true;
    }
}
bool Date::operator<=(const Date& d)
{
    if ((*this < d) || (*this == d))
    {
        return true;
    }
    else
    {
        return false;
    }
}

Date& Date::operator++()
{
    int ret=GetMonthDay(*this);
    if (this->_day + 1 > ret)
    {
        this->_day = 1;
        this->_month += 1;
        if (this->_month > 12)
        {
            this->_month = 1;
            this->_year += 1;
        }
        return *this;
    }
    else
    {
        this->_day += 1;
        return *this;
    }
}
Date Date::operator++(int)
{
    Date tmp(*this);
    int ret = GetMonthDay(*this);
    if (this->_day + 1 > ret)
    {
        this->_day = 1;
        if ((this->_month += 1) > 12)
        {
            this->_month = 1;
            this->_year += 1;
        }
    }
    else
    {
        this->_day += 1;
    }
    return tmp;
}
Date& Date::operator--()
{
    int ret = GetMonthDay(*this);
    if ((this->_month == 1) && (this->_day == 1))  //1月1号
    {
        this->_day = 31;
        this->_month = 12;
        this->_year -= 1;
    }
    else if (this->_day == 1)           //除12月的某个月的1号
    {
        Date tmp = GetUpMonthDay(*this);
        this->_day = GetMonthDay(tmp);
    }
    else
    {
        this->_day -= 1;
    }
    return *this;
}
Date Date::operator--(int)         //不对
{
    Date tmp(*this);
    --(*this);
    return tmp;
}
//日期+天数 
Date& Date::operator+(int day)
{
    int i;
    for (i = day; i > 0; i--)
    {
        ++(*this);
    }
    return *this;
}
//日期-天数 
Date& Date::operator-(int day)
{
    int i;
    for (i = day; i > 0; i--)
    {
        --(*this);
    }
    return *this;
}
// //日期-日期 
int Date::operator-(Date& d)
{
    int count = 0;
    while (*this != d)
    {
        count++;
        if (*this > d)
        {
            d++;
        }
        else
        {
            (*this)++;
        }
    }
    return count;
}
//测试是个默认成员函数的重载
void test1()
{
    Date d1(2000, 4, 5);
    Date d2(1994, 10, 24);
    Date d3=d1;
    d1 = d2;
    cout << d1 << endl;
    cout << d2 << endl;
    cout << d3 << endl;
    cout << d1.isLeapYear(d1) << endl;
}
//比较两个日期的是否相等
void test2()
{
    Date d1(1994, 4, 5);
    Date d2(1994, 10, 24);
    Date d3(1994, 4, 5);
    if (d1 != d2)
    {
        cout << "1" << endl;
    }
    else
    {
        cout << "0" << endl;
    }
}
//比较日期的大小
void test3()
{
    Date d1(1994, 4, 5);
    Date d2(1994, 4, 6);
    Date d3(1995, 4, 6);
    Date d4(1995, 5, 6);
    if (d2 < d1)
    {
        cout << "1" << endl;
    }
    else
    {
        cout << "0" << endl;
    }
}
//时间自增自减
void test4()
{
    Date tmp(0, 0, 0);
    Date d1(2001, 1, 2);
    tmp=++d1;
    //++d1;
    //tmp=d1++;       //这块有错误
    //--d1;
    //Date tmp=d1--;
    cout << d1 << endl;
    cout << tmp << endl;
}
void test5()
{
    Date d1(2017, 7, 10);
    Date d2(2016, 6, 3);
    int ret = d2 - d1;
    cout << ret << endl;

//  d1 - 95;
//  cout << d1 << endl;
//  d1.GetUpMonthDay(d1);
//  d1.GetNextMonthDay(d1);
//  cout << d1 << endl;

}
int main()
{
    //test1();
    //test2();
    //test3();
    //test4();
    test5();

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值