C++类与对象 时间的练习

     类和对象,可以说是C++语言很重要的一环,但是在这里不做过多的讲解,仅仅提供一个时间的实现来体会,主要涉及的是 析构函数,构造函数,拷贝构造函数,和各种的重载(如前置与后置等诸多问题)

附带有简单的讲解,希望对你学习类与对象有所帮助。

using namespace std;
#include<iostream>
#include<assert.h>
class Date
{
public:
    // 获取某年某月的天数  这个函数是很关键的,有助于获取具体哪一个月的天数有几天,方便于后续的操作
     int GetMonthDay(int year,int month)
     {
         assert(month > 0 && month < 13);
         int array[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
      if (month == 2 && (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
     {
         array[2] = 29;
     }
​
     return array[month];
 }
// 构造函数
Date(int year , int month , int day )
{
    //对于不合法构造的检查
    assert(month > 0 && month < 13);
    assert(day > 0 && day <= GetMonthDay(year, month));
    _year = year;
    _month = month;
    _day = day;
}
// 拷贝构造函数  拷贝构造,传的是引用,有助于效率的提升
Date(const Date& d)
{
    _year = d._year;
    _month = d._month;
    _day = d._day;
}
​
// 赋值运算符重载  传引用,传出引用,有助于更加高效
Date& operator=(const Date& d)
{
    if (this!=&d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }
​
    return *this;
}
// 析构函数
~Date()
{
    _year = 0;
    _month = 0;
    _day = 0;
}
// 日期 += 天数(于本身做修改)
Date& operator+=(int day)
{
    _day += day;
    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _year++;
            _month = 1;
        }
    }
    return *this;
}
// 日期+天数
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 operator-(int day)
{
    Date tmp = *this;
    tmp._day -= day;
    while (tmp._day <= 0)
    {
        tmp._month--;
        if (tmp._month == 0)
        {
            tmp._month = 12;
            tmp._year--;
        }
        tmp._day += GetMonthDay(tmp._year,tmp._month);
    }
    return tmp;
}
// 日期-=天数
Date& operator-=(int day)
{
    _day -= day;
    while (_day <= 0)
    {
        _month--;
        if (_month == 0)
        {
            _month = 12;
            _year--;
        }
        _day += GetMonthDay(_year, _month);
    }
    return *this;
}
// 前置++
Date& operator++()
{
    _day++;
    if (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        if (_month == 12)
        {
            _year++;
            _month = 1;
        }
        else
        {
            _month++;
        }
    }
​
    return *this;
}
// 后置++
Date operator++(int)
{
    Date tmp = *this;
    tmp._day++;
    if (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 operator--(int)
{
    Date tmp = *this;
    if (tmp._day == 1)
    {
        if (tmp._month == 1)
        {
            tmp._year--;
            tmp._month = 12;
            tmp._day = 31;
        }
        else
        {
            tmp._month--;
        }
    }
    else
    {
       tmp._day--;
    }
​
    return tmp;
}
// 前置--
Date& operator--()
{
   
    if (_day == 1)
    {
        if (_month == 1)
        {
            _year--;
            _month = 12;
            _day = 31;
        }
        else
        {
            _month--;
            _day = GetMonthDay(_year, _month);
        }
    }
    else
    {
        _day--;
    }
​
    return *this;
}
​
// >运算符重载  第一个的完成很关键,之后可以复用
bool 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 operator==(const Date& d)
{
    if (_year == d._year &&
        _month == d._month &&
        _day == d._day)
        return true;
    return false;
}
    
// >=运算符重载
bool operator >= (const Date& d)
{
    if (operator>(d) || operator==(d))
        return true;
    return false;
}
    
// <运算符重载
bool operator < (const Date& d)
{
    if (operator>(d) || operator==(d))
        return false;
    return true;
}
    
// <=运算符重载
bool operator <= (const Date& d)
{
    if (operator>(d))
        return false;
    return true;
}
    
// !=运算符重载
bool operator != (const Date& d)
{
   /* if (_year == d._year &&
        _month == d._month &&
        _day == d._day)
        return false;
    return true;*/
    if (operator==(d))
        return false;
    return true;
}
// 日期-日期 返回天数  这个思路比较巧妙
int operator-(const Date& d)
{
     int flag = 1;
     Date max = *this;
     Date min = d;
​
    if (*this < d)
    {
         max = d;
        min = *this;
         flag = -1;
    }
​
    int day = 0;
    while (min < max)
    {
        ++(min);
        ++day;
    }
    return day * flag;
}
​
//打印日期
void Print()
{
    cout << _year <<"/" << _month <<"/" << _day << endl;
}
private:
    int _year;
    int _month;
    int _day;
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值