哪些企业网站使用水墨风格,wordpress手机域名,莆田哪里有学做网站的,顺德大良那里做网站好前言
对于许多出初学C的同学来说首先接触的第一个完整的类便是日期类#xff0c;这个类能有效的帮助我们理解C中有关类的初始化以及重载的相关知识#xff0c;帮助我们轻松上手体验C的魅力。 文章目录 前言一、日期类整体初概二、构造2.1 判断日期是否合法2.2 构造函数 三、…前言
对于许多出初学C的同学来说首先接触的第一个完整的类便是日期类这个类能有效的帮助我们理解C中有关类的初始化以及重载的相关知识帮助我们轻松上手体验C的魅力。 文章目录 前言一、日期类整体初概二、构造2.1 判断日期是否合法2.2 构造函数 三、关系判断3.1 大于运算符3.2 等于运算符3.3 其余运算符重载 四、日期的加减运算4.1 /运算符4.2 -/-运算符4.3 日期相减4.4 推算当日星期 五、前置与后置运算符5.1 前置运算符5.2 后置运算符 六、流插入和流提取操作符重载 一、日期类整体初概
完成一个类我们首先需要了解这个类需要完成什么任务需要哪些函数来进行实现以下是一个日期类的模板框架。
class Date
{//检查日期合法bool CheckDate();//获取每月天数int GetMonthDay(int year, int month);//构造函数Date(int year 1900, int month 1, int day 1);//关系判断操作符重载bool operator(const Date d1);bool operator (const Date d2);bool operator(const Date d1);bool operator(const Date d1);bool operator(const Date d1);bool operator!(const Date d1);//日期类的加减操作Date operator (int day);Date operator (int day);Date operator-(int day);Date operator-(int day);//日期减去日期int operator- (const Date d);//计算当前天数为星期几void WeekDay();//前置、后置操作符Date operator();Date operator(int);Date operator--();Date operator--(int);//流插入和流提取操作符重载friend ostream operator(ostream out, const Date d);friend istream operator(istream in, Date d);
};二、构造
在确认基本框架后第一步是为我们的自定义类创建一个合适的构造函数对于日期类而言我们则需要在最开始实例化类的时候对日期进行一个判断判断日期的合法性例如年份大于1月份在1-12之间天数在对于的月份天数之内具体的是实现如下
2.1 判断日期是否合法
//获取当前月份的日期
int GetMonthDay(int year, int month)
{static int days[13] { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int day days[month];if (month 2 ((year % 4 0 year % 100 ! 0) || (year % 400 0))){day 1;}return day;
}// 检查日期是否合法
bool CheckDate()
{if (_year 1 || _month13 || _month 1 || _day1 || _dayGetMonthDay(_year, _month))return false;return true;
}2.2 构造函数
Date(int year1900,int month1,int day1){_year year;_month month;_day day;//检查生成的日期是否非法if (!CheckDate()){cout 日期非法: ;Print();//退出程序正常退出exit(0)非法退出exit(非0);exit(-1);}}三、关系判断
3.1 大于运算符
bool operator(const Date d1)
{if ((_year d1._year)|| (_year d1._year _month d1._month)|| (_year d1._year _month d1._month _day d1._day)){return true;}return false;
}3.2 等于运算符
bool operator (const Date d2)
{return _year d2._year _month d2._month _day d2._day;
}3.3 其余运算符重载
在上面我们实现了 、 两个运算符重载。为了方便和提高可读性对于剩下的、 、 、! 这四个运算符我们可以复用的方式实现利用 、 两个运算符的逻辑组合来进行实现。
bool operator(const Date d1)
{return (*this d1) || (*this d1);
}bool operator(const Date d1)
{return !(*this d1);
}bool operator(const Date d1)
{return !(*this d1);
}bool operator!(const Date d1)
{return !(*this d1);
}四、日期的加减运算
4.1 /运算符
思路上我们选择一个日期加上具体天数之后采取逐一加天数的方式每次加完之后进行判断当前天数是否大于当月天数同时当月数进一的时候判断当前月数是否大于十二依次进位。
Date operator (int day)
{//如果day 是负数 调用-操作符重载if (day 0){return *this - (-day);}Date d1(*this);//直接加到_day上直到_day合法。d1._day day;while (d1._day GetMonthDay(d1._year, d1._month)){d1._day - GetMonthDay(d1._year, d1._month);d1._month;if (d1._month 13){d1._month 1;d1._year;}}return d1;
}// 直接复用 运算符即可
Date operator (int day)
{*this *this day;return *this;
}4.2 -/-运算符
思路上和日期加天数是一样的但是不同的地方在于当前天数小于1时我们采取月份减一的方式依次借位。
Date operator-(int day)
{//如果减去负天数 ,则调用 if (day 0){return *this -day;}//直接减去_day - day;//借位减去天数直到天数合法while (_day 0){--_month;if (_month 0){--_year;_month 12;}//加上天数_day GetMonthDay(_year, _month);}return *this;
}// 复用顺序不重要
Date operator-(int day)
{Date temp(*this);temp - day;return temp;
}4.3 日期相减
我们在上面已经实现了日期加上天数以及两个日期之间是否相等的判断在此可以直接复用默认前一个日期大于后一个日期将较小的日期天数逐次加一当加到和较大天数相等时此时加一的次数就是日期之间相差的天数。
//两个日期相减
int operator- (const Date d)
{//先假设 *this dint flag 1;Date max *this;Date min d;if (*this d){max d;min *this;flag -1;}int count 0;while (min ! max){ min;count;}return count * flag;
}4.4 推算当日星期
由于1900年1月1日正好是周一因此我们计算某个日期减去1900年1月1日得到的天数并对七取模即可。
//判断当前日期是周几
void WeekDay( )
{Date statr(1900, 1, 1);//求相差的天数int n *this - statr;//5相当于是周6int weekday 0;weekday n;cout 周 weekday % 7 1 endl;
}五、前置与后置运算符
对于前置和后置运算符两者之间似乎操作数一样但是不同之处在于后置重载时有一个操作数同时需要注意后置运算符返回值应是修改前的值对于 “–” 运算符与 ““ 运算符基本一致不在此列出。
5.1 前置运算符
Date operator()
{return *this 1;
}5.2 后置运算符
Date operator(int)
{Date temp(*this);*this 1;return temp;
}六、流插入和流提取操作符重载
相比于其他的运算符流插入和流提取则有一丝不同我们知道运算符重载时默认第一位是 this 指针但是流插入和流提取第一个操作数明显是流插入运算符或流提取运算符因此必须将其设为全局函数。
此时又会遇到另一个问题全局函数如何访问类的私有成员此时就需提前将其声明为友元函数在进行重载。
ostream operator(ostream out,const Date d)
{out d._year / d._month / d._day;return out;
}istream operator(istream in, Date d)
{in d._year d._month d._day;//检查输入格式是否正确assert(d.CheckDate());return in;
}