C++学习笔记:第十章运算符重载之实现一个日期类,并实现基本运算

运算符重载综合练习题目:
设计一个日期类Date,包括年、月、日等私有成员。
要求实现基本运算:如一个日期加上天数,一个日期减去天数、两个日期相差天数。
基本设计思路及要求:
1.在Date类中设计如下重载运算符函数:
Date operator+(int days); 返回一个日期加上一个天数得到的日期
Date operator-(int days); 返回一个日期减去一个天数得到的日期
int operator-(Date &b); 返回两日期相差的天数
2.在实现这些重载运算符函数调用以下私有成员函数:
leap(int); 判断指定的年份是否为闰年
transDate(Date &); 将指定日期转换为从0年0月0日起的天数
transDay(int); 将指定的0年0月0日起的天数转换为对应的日期
3.在main( )中,实现日期的基本运算:
(1).闰年与非闰年的判断,以及各月的天数的获得问题,解决办法可设置并引用二维数组;
(2).日期基本问题的实现问题,解决办法是在Date类中设计重载运算符函数:Date operator+(int days)、Date operator-(int days)、int operator-(Date &b),同时调用以下私有成员函数leap(int)、transDate (Date &)、transDay (int)得以实现;

#include <iostream>

using namespace std;
/*
*题目:设计一个日期类Date,包括年、月、日等私有成员。
      要求实现基本运算:如一个日期加上天数,一个日期减去天数、两个日期相差天数。
*作者:youshen_wwd
*日期:2020/5/28
*/
//一个二维数组保存闰年与平年的每月的日子数
int each_month[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
class Date{
private:
    int year;//年
    int month;//月
    int day;//日
    bool leap (int y){//判断指定年份是否为闰年
    if (((y%4==0)&&(y%100!=0))||(y%400==0))
        return true;
    else
        return false;
    }
    int transDate(Date &d){//将指定日期转换为从0年0月0日起的天数
        int days=0;
        for(int y=1;y<=d.year;y++){
            if (leap(y)==true)//若为闰年则添加366天,反之添加365天
                days+=366;
            else
                days+=365;
        }
        for(int m=1;m<d.month;m++){//计算月份天数
            if (leap(d.year)==true)
                days+=each_month[1][m-1];
            else
                days+=each_month[0][m-1];

        }
        days+=d.day;

        return days;
    }

    Date transDay(int days){//将指定的0年0月0日起的天数转换为对应的日期
        int y=1;
        int m=1;
        int rest=days;
        while(1){
            if(leap(y)){//若是闰年则递减366天
                if(rest<=366)
                    break;
                else
                    rest-=366;
            }
            else{//若是平年则递减365天
                if(rest<=365)
                    break;
                else
                    rest-=365;
            }
            y++;
        }
        y--;//执行到此年份y已确定
        bool lp=leap(y);
        while(true){
            if(lp){//计算月份
                if(rest>each_month[1][m-1])
                    rest-=each_month[1][m-1];
                else
                    break;
            }
            else{
                if(rest>each_month[0][m-1])
                    rest-=each_month[0][m-1];
                else
                    break;
            }
            m++;
        }
        int d=rest;//日
      return Date(y,m,d);
    }

public:
    Date(){year=0;month=0;day=0;}
    Date(int y,int m,int d){year=y;month=m;day=d;}
    Date operator+(int days){//返回一个日期加上一个天数得到的日期
         Date date;
        int sdays=transDate(*this)+days;
        date=transDay(sdays);
        return date;
    }
    Date operator-(int days){//返回一日期减去天数得到的日期
         Date date;
        int sdays=transDate(*this)-days;
        date=transDay(sdays);
        return date;
    }
    int operator-(Date &d){//返回两日期相差的天数
        int cdays=transDate(*this)-transDate(d);
        if(cdays>=0)
            return cdays;
        else
            return -cdays;
    }
    void display(){
        cout<<year<<"/"<<month<<"/"<<day<<endl;
    }

};


int main()
{
Date d1(1999,10,22);
Date d2(2000,10,30);
cout<<"第一个日期是"<<endl;
d1.display();
cout<<"第二个日期是"<<endl;
d2.display();
Date newd1=d1+20;
cout<<"第一个日期加上20天后的日期是";
newd1.display();
Date newd2=d2-29;
cout<<"第二个日期减去29天后的日期是";
newd2.display();
int days=d2-d1;
cout<<"两个日期相差天数为"<<days;
}

特别注意*this的用法,也可在二元运算符重载那儿使用友元函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值