C++基础 Data类的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaoxaun666/article/details/79778493

Data类:


#include <iostream>
#include <assert.h>
#include <Windows.h>
using namespace std;

class Date
{
public:
    Date(int year=1990,int month=1,int day=1)//构造函数
        :_year(year)
        ,_month(month)
        ,_day(day)
    {
        if (!IsInvalid())//判断月份天数是否符合
        {
            assert(false);
        }
    }
    friend istream &operator>>(istream &ii, Date &d);//利用友元可以外部访问类内的成员
    friend ostream &operator<<(ostream &mm,const Date &d);
    Date(const Date&d)//拷贝构造函数
    {
        _year=d._year;
        _month=d._month;
        _day=d._day;
    }
    ~Date(){}//析构
    bool IsInvalid();//
    bool isLeapYear(int year);//判断闰年
    int GetMonthDay(int year, int month);//取出这个月是多少天
    void Show();
    Date& 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); 
    // d1 < d2 
    bool operator<(const Date& d);
    // d1 + 10 
    Date operator+(int day);//+运算
    Date& operator+=(int day); 
    Date operator-(int day); 
    Date& operator-=(int day); 
    int operator-(const Date& d); 

    //++d1 
    Date& operator++(); // 前置 
    //d1++ 
    Date operator++(int); // 后置 
    Date& operator--(); 
    Date operator--(int); 

private:
    int _year;
    int _month;
    int _day;
};
bool Date::IsInvalid()
{
    if (this->_year>1900 &&(this->_month>=1 &&this->_month<=12)&&(this->_day>=1 &&this->_day<=GetMonthDay(_year,_month)))
    {
        return true;
    }
    return false;
}
bool Date::isLeapYear(int year)
{
    if ((year%4==0 &&year%100!=0)||(year%400==0))
    {
        return true;
    }
    return false;
}
int Date::GetMonthDay(int year, int month)
{
    assert(month>0&&month<=12);
    int day;
    int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if (isLeapYear(year)&&month==2)
    {
        return day=arr[month]+1;
    }
    day=arr[month];
    return day;
}
void Date::Show()
{
    cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}
Date& Date:: operator=(const Date& d)
{
    if (this!=&d)
    {
        this->_year=d._year;
        this->_month=d._month;
        this->_day=d._day;
    }
    return *this;
}
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);
}
bool Date:: operator>(const Date &d)
{
    return (_year>=d._year)||(_year>=d._year &&_month>=d._month)||_year>=d._year &&_month>=d._month &&_day>d._day;
}
bool Date::operator<(const Date&d)
{
    return (_year<=d._year)||(_year<=d._year &&_month<=d._month)||_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)||(*this==d);
}
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);//写在这是因为加的天数在这个月到月低是多少天
        if (tmp._month==12)
        {
            tmp._year++;
            tmp._month=1;
        }
        else
        {
            tmp._month++;
        }
    }
    return tmp;
}
Date& Date:: operator+=(int day)
{
    *this=*this+day;
    return *this;
}
Date Date::operator-(int day)
{
    Date tmp(*this);
    if (day<0)
    {
        return tmp+(-day);
    }
    tmp._day-=day;
    while (tmp._day<1)
    {
        if (tmp._month==1)
        {
            tmp._year--;
            tmp._month=12;
        }
        else
        {
            tmp._month--;
        }
        tmp._day+=GetMonthDay(tmp._year,tmp._month);//写在这是因为减的天数到上个月到月低是多少天
    }
    return tmp;
}
Date & Date::operator-=(int day)
{
    *this=*this-day;
    return *this;
}
Date& Date::operator++()//前置 返回引用
{
    _day+=1;
    while (_day>GetMonthDay(_year,_month))
    {
        _day-=GetMonthDay(_year,_month);
        if (_month==12)
        {
            _year++;
            _month=1;
        }
        else
        {
            _month++;
        }
    }
    return *this;
}
Date Date::operator++(int)//后置 返回创建的
{
    Date tmp(*this);
    _day+=1;
    while (_day>GetMonthDay(_year,_month))
    {
        _day-=GetMonthDay(_year,_month);
        if (_month==12)
        {
            _year++;
            _month=1;
        }
        else
        {
            _month++;
        }
    }

    return tmp;
}
Date&Date::operator--()
{
    _day-=1;
    while (_day<1)
    {
        if (_month==1)
        {
            _year--;
            _month=12;
        }
        else
        {
            _month--;
        }
        _day+=GetMonthDay(_year,_month);
    }
    return *this;
}
Date Date::operator--(int)
{
    Date tmp(*this);
    _day-=1;
    while (_day<1)
    {
        if (_month==1)
        {
            _year--;
            _month=12;
        }
        else
        {
            _month--;
        }
       _day+=GetMonthDay(_year,_month);
    }

    return tmp;
}
int Date::operator-(const Date &d)
{
    Date Max(*this);
    Date Min(d);
    int flage=1;
    if (*this<d)
    {
        Max=d;
        Min=*this;
        flage=-1;
    }
    int day=0;
    while (Max!=Min)
    {
        ++Min;
        ++day;
    }
    return day*flage;

}
ostream &operator<<(ostream &mm,const Date &d)
{
    mm<<d._year<<"-"<<d._month<<"-"<<d._day<<endl;
    return mm;
}
istream &operator>>(istream &ii, Date &d)
{
    cout<<"输入日期"<<endl;
    ii>>d._year;
    ii>>d._month;
    ii>>d._day;
    return ii;
}
int main()
{
    Date d(2018,3,30);
    Date d1(2018,9,1);
    Date d4;
    cin>>d4;

    cout<<d4;
    //Date m(d);//拷贝函数
    //m.Show();
    system("pause");
}
阅读更多
换一批

没有更多推荐了,返回首页