唐山网站建设,网站怎么做404页面的跳转,宁夏枸杞网站建设方案,网站建设与管理相关工作岗位文章目录1. 日期类的具体实现1.查询当前月份的天数2. 构造函数的实现(注意)3.d1d24. d1!d25. d1d26. d1d27. d1d28. d1d29. 日期天数10.日期天数11.日期-天数12. 日期-天数13. d和 d14. --d 和 d--15.日期日期 返回天数2. 函数的声明——date.h3. 函数的定义—…
文章目录1. 日期类的具体实现1.查询当前月份的天数2. 构造函数的实现(注意)3.d1d24. d1!d25. d1d26. d1d27. d1d28. d1d29. 日期天数10.日期天数11.日期-天数12. 日期-天数13. d和 d14. --d 和 d--15.日期日期 返回天数2. 函数的声明——date.h3. 函数的定义——date.cpp4.函数调用——main.cpp由于拆分了函数的声明和定义所以在函数前面要加上date类找到函数1. 日期类的具体实现
1.查询当前月份的天数
int date::getmonthday(int year, int month)
{int arr[13] { 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) )){//是闰年并且是2月份return 29;}return arr[month];
}设置一个数组下标对应月份并把2月闰年的情况单拉出来
2. 构造函数的实现(注意)
date::date(int year, int month, int day)
{//判断日期是否合法if ( month0 month 13 ( day0daygetmonthday(year,month) ) ){_year year;_month month;_day day;}else{cout 日期不合法 endl;}
}一定要注意日期传过来是否合法存在
3.d1d2
bool date::operator(const date d)
{return (_year d._year) (_month d._month) (_day d._day);
}判断 年 月 日依次是否相等
4. d1!d2
bool date::operator!(const date d)
{return !(*this d);//复用d1d2的相反逻辑
}如果我们再次自己写就会有很多情况考虑所以直接复用 d1d2的取反
5. d1d2
bool date::operator(const date d)
{if (_year d._year)//年小为小{return true;}else if (_year d._year _month d._month)//年相等 月小为小{return true;}else if (_year d._year _month d._month _day d._day)// 年月相等 天小为小{return true;}else{return false;}
}年小的为小 年相等月小为小 年 月相等天小为小 其他情况都为false
6. d1d2
bool date::operator(const date d)
{return (* this d) || (*this d);//复用 d1d2 和d1d2的情况
}d1d2是由 d1d2 和d1d2 组成分别复用两者即可实现
7. d1d2
bool date::operator(const date d)
{return !(*this d) (*this ! d);//复用 d1d2的逻辑反 以及d1!d2
}d1d2的逻辑取反是 d1d2 由于d1d2我们已经实现过了只需要加上d1!d2即可
8. d1d2
bool date::operator(const date d)
{return !(* this d);//复用d1d2的逻辑反
}复用d1d2的逻辑取反即可实现 d1d2
9. 日期天数
date date::operator(int day)
{if (day 0)// -等价于 -{*this - -day;//复用-return *this;}//由于是改变本身,所以返回*thisint getday _day day;//判断当前加上的天数是否大于当前月份的天数while (getday getmonthday(_year, _month)){getday - getmonthday(_year, _month);_month;if (_month 13){_year;_month 1;}}//最后注意剩余的getday就为当前月份的天数_day getday;//除了作用域 *this 还在所以可以使用引用返回return *this;
}当day为负时 - 等价于- 所以调用-的复用即可(-实现在后面) 同样由于是对于本身操作除了作用域还存在所以使用引用返回
10.日期天数
date date::operator(int day)
{//注释的为第一种方法//由于不改变日期本身所以用一个临时变量代替//date ret *this;//int getday ret._day day;判断当前加上的天数是否大于当前月份的天数//while (getday getmonthday(ret._year, ret._month))//{// getday - getmonthday(ret._year, ret._month);// ret._month;// if (ret._month 13)// {// ret._year;// ret._month 1;// }//}最后注意剩余的getday就为当前月份的天数//ret._day getday;除了作用域 ret不在了所以使用传值返回//return ret;//方法二date tmp *this;tmp day;return tmp;//复用 日期天数的功能
}
这里用了两种方法实现但是可以发现第一种过于繁琐只需复用上述返回临时变量tmp即可 同样由于临时变量出了作用域就不存在了所以使用传值返回
11.日期-天数
date date::operator-(int day)
{if (day 0){*this -day;//复用return *this;}_day - day;//当day 小于 当前月份的天数 直接return//当 day大于等于 当前月份的天数 进入循环while (_day 0){//返回到上一个月份_month--;//当月份为1时 --为0if (_month 0){_year--;_month 12;}_day getmonthday(_year, _month);}return *this;
}这里不太好想如果当前日期月份的天数_day大于day则直接return若小于则会使_day为负进入循环同时向上一个月借天数直到 _day0 若day为负--等价于 直接复用即可
12. 日期-天数
date date::operator-(int day)
{date ret *this;ret - day;return ret;
}复用上面的-即可返回临时变量ret
13. d和 d
date date::operator()//d
{*this 1;//复用return *this;
}前置是正常调用operator并且返回本身因为除了作用域还存在所以用引用返回
date date::operator(int)//d
{date ret *this;*this 1;//复用return ret;
}后置因为同样是operator为了区分所以加上参数int用于占位没有实际作用)构成函数重载 因为返回临时变量ret所以用传值返回
14. --d 和 d–
date date::operator--()//--d
{*this - 1;//复用-return *this;
}前置- -是正常调用operator- -并且返回本身因为除了作用域还存在所以用引用返回
date date::operator--(int)//d--
{date ret *this;*this - 1;//复用-return ret;
}后置- -因为同样是operator- -为了区分所以加上参数int用于占位没有实际作用)构成函数重载 因为返回临时变量ret所以用传值返回
15.日期日期 返回天数 date date::operator--(int)//d--
{date ret *this;*this - 1;//复用-return ret;
}int date::operator-(date d){date max *this;date min d;if (*this d)//复用{max d;min *this;}int n 0;while (min ! max)//复用!{n;if (min._day getmonthday(min._year, min._month)){min._day;}else{min._month;min._day 1;}if (min._month 13){min._year;min._month 1;}}return n;}主要使用max和min两个临时变量使min._day不断最终使maxmin 结束返回计数n值
2. 函数的声明——date.h
#includeiostream
using namespace std;
class date
{
public://函数声明int getmonthday(int year, int month);//查询当前月份的天数date(int year1, int month1, int day1);//构造void print();//输出bool operator(const date d);//d1d2bool operator!(const date d);//d1!d2bool operator(const date d);//d1d2bool operator(const date d);//d1d2bool operator(const date d);//d1d2bool operator(const date d);//d1d2date operator(int day);//日期天数date operator(int day);//日期天数date operator-(int day);//日期-天数date operator-(int day);//日期-天数date operator();//d//int 参数仅是为了占位构成函数重载 区分前置date operator(int);//ddate operator--(); //--ddate operator--(int);//d--int operator-( date d);//日期-日期 返回天数
private:int _year;int _month;int _day;
};3. 函数的定义——date.cpp
#includedate.h
//函数实现
int date::getmonthday(int year, int month)
{int arr[13] { 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) )){//是闰年并且是2月份return 29;}return arr[month];
}
date::date(int year, int month, int day)
{//判断日期是否合法if ( month0 month 13 ( day0daygetmonthday(year,month) ) ){_year year;_month month;_day day;}else{cout 日期不合法 endl;}}
void date::print()
{cout _year - _month - _day endl;
}
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);//复用d1d2的相反逻辑
}
bool date::operator(const date d)
{if (_year d._year)//年小为小{return true;}else if (_year d._year _month d._month)//年相等 月小为小{return true;}else if (_year d._year _month d._month _day d._day)// 年月相等 天小为小{return true;}else{return false;}
}
bool date::operator(const date d)
{return (* this d) || (*this d);//复用 d1d2 和d1d2的情况
}
bool date::operator(const date d)
{return !(*this d) (*this ! d);//复用 d1d2的逻辑反 以及d1!d2
}
bool date::operator(const date d)
{return !(* this d);//复用d1d2的逻辑反
}date date::operator(int day)
{if (day 0)// -等价于 -{*this - -day;//复用-return *this;}//由于是改变本身,所以返回*thisint getday _day day;//判断当前加上的天数是否大于当前月份的天数while (getday getmonthday(_year, _month)){getday - getmonthday(_year, _month);_month;if (_month 13){_year;_month 1;}}//最后注意剩余的getday就为当前月份的天数_day getday;//除了作用域 *this 还在所以可以使用引用返回return *this;
}
date date::operator(int day)
{由于不改变日期本身所以用一个临时变量代替//date ret *this;//int getday ret._day day;判断当前加上的天数是否大于当前月份的天数//while (getday getmonthday(ret._year, ret._month))//{// getday - getmonthday(ret._year, ret._month);// ret._month;// if (ret._month 13)// {// ret._year;// ret._month 1;// }//}最后注意剩余的getday就为当前月份的天数//ret._day getday;除了作用域 ret不在了所以使用传值返回//return ret;date tmp *this;tmp day;return tmp;//复用 日期天数的功能
}date date::operator-(int day)
{if (day 0){*this -day;//复用return *this; }_day - day;//当day 小于 当前月份的天数 直接return//当 day大于等于 当前月份的天数 进入循环while (_day 0){//返回到上一个月份_month--;//当月份为1时 --为0if (_month 0){_year--;_month 12;}_day getmonthday(_year, _month);}return *this;
}
date date::operator-(int day)
{date ret *this;ret - day;return ret;
}
date date::operator()//d
{*this 1;return *this;
}
date date::operator(int)//d
{date ret *this;*this 1;return ret;
}date date::operator--()//--d
{*this - 1;//复用-return *this;
}date date::operator--(int)//d--
{date ret *this;*this - 1;//复用-return ret;
}int date::operator-(date d){date max *this;date min d;if (*this d){max d;min *this;}int n 0;while (min ! max){n;if (min._day getmonthday(min._year, min._month)){min._day;}else{min._month;min._day 1;}if (min._month 13){min._year;min._month 1;}}return n;}4.函数调用——main.cpp
#includedate.h
int main()
{date d1(2023, 2, 9);date d2(2023, 2, 1);cout (d1d2) endl;cout (d1 d2) endl;cout (d1 - d2) endl;return 0;
}