c++简单的日期计算器

设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算。
要求在Date类中设计如下重载运算符函数:
Date operator+(int days):返回某日期加上天数得到的日期
Date operator-(int days):返回某日期减去天数得到的日期
int operator-(Date&b):返回两日期相差的天数
leap(int):判断指定的年份是否为闰年
dton(Date &):将指定日期转换成从日起的天数
ntod(int):将指定的
日起的天数转换成对应的日期

#include <iostream> 
using namespace std;

int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};

class Date
{     int year,mon,day;
      bool leap(int);
      int dton(Date &);
      Date ntod(int);
 public:
      Date(int a=2002,int b=11, int c=20 )
      {year=a;
       mon=b;
       day=c;}
  Date operator+(int);
  Date operator-(int);
  int operator-(Date &b);
  int gety()
     {return year;}
  int getm()
     {return mon;}
  int getd()
     {return day;}
}; 
bool Date::leap(int t)
   {if (t%4) return false;  
      else return true;
   }

int Date::dton(Date &d) //将此对象的日期转化为从d年月日起的天数;
{int yd,md,dd,DAY=0;
 if (d.year>year) { return -1;}
    else if ((d.year==year)&&(d.mon>mon)){ return -1;}
    else if ((d.year==year)&&(d.mon==mon)&&(d.day>=day)){return -1;}  
 yd=year-d.year;
 md=mon-d.mon;
 dd=day-d.day;
 if ((yd==0)&&(md==0))  {return dd;}
   else if (yd==0)
       {DAY+=a[d.mon-1]-d.day;
        DAY+=day;
        for(int i=d.mon;i<mon-1;i++)
            {DAY+=a[i];}
        }
  else 
    { 
      for (int i=d.mon;i<=12;i++)
         { if (i==d.mon) {DAY+=a[i-1]-d.day;}
              else DAY+=a[i-1];
         }
     for (int i=d.year+1;i<year;i++)
        { if (leap(i)) {DAY+=366;}
           else {DAY+=365;}
        }
    for (int i=mon;i>0;i--)
       { if (i==mon) {DAY+=day;}
          else DAY+=a[i-1];
       }
  }
return(DAY);
}

Date Date::ntod(int n) //将指定的年月日起的n天数转化为对应日期
{int ty,tm,td,p;
 ty=year;
 tm=mon;
 p=tm;
 if (n-(a[mon-1]-day)<=0)
  {Date m(ty,tm,day+n);
   return m;}
 n=n-(a[mon-1]-day);
 td=a[tm-1];
 if (leap(ty)) a[1]=29;
  else a[1]=28;
 while(n>a[p])
 {tm++;p++;
  td=a[p-1];
  n-=a[p-1];
  if (leap(ty+tm/12)) a[1]=29;
   else a[1]=28;
  if (tm%12==0) p=0;
 } 
 ty+=tm/12;
 tm=tm%12;
 if (tm==0) 
  {Date m(ty,1,n);
   return m;
 }
 else
 { Date m(ty,tm+1,n);
  return m;}
}

Date Date::operator+(int n)
{*this=ntod(n);
 return *this;
}

 Date Date::operator-(int m)
 {int p=0;
  Date test(year,mon,day);
  if (leap(year)) a[1]=29;
   else a[1]=28;
  while(p!=m)
  {if (test.day==1)
  {if (test.mon!=1)
    {test.mon--;
     test.day=a[test.mon-1];
    }
  else
   { test.year--;
     test.mon=12;
     test.day=31;
   }
  }
  else 
  { test.day--;
   }
    p=dton(test);
  }
  return test;
 }

 int Date::operator-(Date &b)
 {return dton(b);
 }

void main()
{int r,y1,y2,m1,m2,d1,d2;
 int y,m,d,day12;
 cout<<"请输入指定日期的年月日:"<<endl;
 cin>>y>>m>>d;
 Date t1(y,m,d),t0(y,m,d),t2;
 cout<<"请输入天数:"<<endl;
 cin>>r;
 t1+r;
 t2=t0-r;
 cout<<"指定日期后"<<r<<"天的日期为"<<t1.gety()<<"年"<<t1.getm()<<"月"<<t1.getd()<<"日"<<endl;
 cout<<"指定日期前"<<r<<"天的日期为"<<t2.gety()<<"年"<<t2.getm()<<"月"<<t2.getd()<<"日"<<endl;
 cout<<"请分别输入两个日期的年月日:"<<endl;
 cin>>y1>>m1>>d1>>y2>>m2>>d2;
 Date n1(y1,m1,d1),n2(y2,m2,d2);
 day12=n1-n2;
 if (day12<0) day12=n2-n1;
 cout<<"两个日期之间相差"<<day12<<"天"<<endl;
}

大部分数据是对的但是有一些数据测试会和预期结果相差1天
尝试了闰年有关的数据但是没有问题
出问题的数据:
请分别输入两个日期的年月日:
2004 3 30
2020 4 20
两个日期之间相差5864天
(少了一天)
请分别输入两个日期的年月日:
2002 3 19
2004 5 20
两个日期之间相差792天
(少了1天)
感觉应该还是闰年的问题??

闰年判断函数有问题,修改如下,供参考:

bool Date::leap(int t)
   {if ((t % 4 == 0 && t % 100 !=0) || t % 400 ==0) return true;
      else return false;
   }


不是闰年的问题啊兄弟,你这个程序输入两个相同天的时候,相差的时间是-1天

已经解决了 是闰年的问题 有些地方年份改变忘记判断是否为闰年了