泉州手机网站建设价格,网站建设哈尔滨网站建设1,网页制作视频教程自学网,wordpress添加菜单分类目录是灰的学习目标#xff1a; 加深对四个默认构造函数的理解#xff1a; 1.构造函数 2.析构函数 3.拷贝构造 4.运算符重载 实现功能 1.比较日期的大小 2.日期-天数 3.前/后置#xff0c;-- 这里基本会使用运算符重载 定义一个日期类 class Date
{
public://1.全缺省参数的构造函数Da…学习目标 加深对四个默认构造函数的理解 1.构造函数 2.析构函数 3.拷贝构造 4.运算符重载 实现功能 1.比较日期的大小 2.日期-天数 3.前/后置-- 这里基本会使用运算符重载 定义一个日期类 class Date
{
public://1.全缺省参数的构造函数Date(int year 1, int month 1, int day 1){_year year;_day day;_month month;}//2.构造拷贝函数Date(const Date x){_year x._year;_month x._month;_day x._day;}//3.析构函数这里可不构造~Date() {}//4.运算符重载bool operator(const Date x);private:int _year;int _month;int _day;
}; 1.比较日期的大小 比较日期大小只用写大于等于或者小于等于其它功能去复用就行关系互斥 --功能声明 --等于实现 //等于(d1 d2;)
bool Date::operator(const Date x)
{return this-_year x._year this-_month x._month this-_day x._day;
} --大于实现 //大于(d1d2)
bool Date::operator(const Date x)
{if ((_year x._year)|| ((_year x._year) (_month x._month))|| ((_year x._year) (_month x._month) (_day x._day)))return true;elsereturn false;
} --小于等于 //小于等于d1d2
bool Date::operator(const Date x)
{return !(*this x);
} --大于等于 //大于等于
bool Date::operator(const Date x)
{return (*this x) || (*this x);
} --小于 //小于(d1d2)
bool Date::operator(const Date x)
{return !(*this x);
} --不等于 //不等于
bool Date::operator!(const Date x)
{return !(*this x);
} 效果 2.日期-天数 准备工作日期-天数要考虑到进位借位以及闰年非闰年的月份天数问题 给出函数 --是否为闰年 //是否为闰年int is_leapyear(int year){if (((year % 4 0) (year % 100 ! 0)) || (year % 400 0)){return 1;}return 0;}--获取月分的天数 //获取每一个月份的天数int GetMonthDay(int year, int month){int month_day[13] { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//存放每个月的月份int is_leap is_leapyear(year);if (is_leap month 2){return month_day[month] 1;//是闰年2月有29天}else{return month_day[month];//不是闰年且不是2月}} 功能声明 这里同样可以实现复用 写好后可以复用写好-可以复用- 为什么不是复用呢 --天数不改变原来日期会改变直接用复用的时候拷贝一份传后的即可 实现 日期天数 //日期天数(d1 100)
Date Date::operator(int day)
{ if (day 0) {return *this - -day;}//1.直接将天数加到该日期的月数中去_day day;//2.判断是否超出当前月数的天数while (_day GetMonthDay(_year,_month)) {//3.超出就进位,重复_day - GetMonthDay(_year,_month);_month;//处理年份if (_month 13) {_month 1;_year;}}return *this;
} 日期天数 //日期天数d1100
Date Date::operator(int day)
{//不改变date拷贝一份Date ret(*this);ret day;return ret;
} 日期-天数 //日期 - 天数( d1 - 100)
Date Date::operator-(int day)
{if (day 0) {return *this -day;}//1.天减去天_day - day;//2.判断是否违法违法向前面借while (_day 0){_month--;//借月数if(_month 0){_year--;_month 12;}//借天数_day GetMonthDay(_year, _month);}return *this;
} 日期-天数 //日期 - 天数( d1 - 100)
Date Date::operator-(int day)
{ //不改d1拷贝一下Date tmp(*this);tmp - day;return tmp;
} 日期-日期 //日期-日期 -
int Date::operator-(const Date d)
{Date max *this;Date min d;int flag 1;//1.找出较小的日期if (*this min) {max d;min *this;flag -1;}int n 0;//2.让较小的日期一直直到等于较大的日期加了多少次它们就差了多少天while (min ! max) {min;n;}//flag用来处理大年减小年或小年减大年的情况return n*flag;} 赋值运算符重载() //赋值
void Date::operator(const Date x)
{_year x._year;_month x._month;_day x._day;
} 效果 3.前/后置-- 前/后置--会有歧义 如运算符重载后的到底是前置还是后置呢 这里使用函数重载解决改变形参来区分 这里说明一下为什么前置可以使用引用返回后置却不行 --前置会先改变d1再直接把d1传回去就行了 --后置会先使用原来的再所有要拷贝一份传回去的是拷贝的tmp出栈就销毁了所有不能传引用 : //前置
Date Date::operator()
{*this 1;return *this;
}//后置
Date Date::operator(int)
{Date tmp(*this);*this 1;return tmp;
} --: 1 //前置--
Date Date::operator--()
{*this - 1;return *this;
}//后置--
Date Date::operator--(int)
{Date tmp(*this);*this - 1;return tmp;
} 效果