当前位置: 首页 > news >正文

做网站双12促销方案惠州做网站哪家公司好

做网站双12促销方案,惠州做网站哪家公司好,关键词林俊杰mp3免费下载,太原免费网站建站模板目录 一. 前言 二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 /- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整代码 一. 前言 通过前面两期类和对象的学习#xff0c;我们已经对C的… 目录 一. 前言  二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 /- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整代码  一. 前言  通过前面两期类和对象的学习我们已经对C的类有了一定的了解。本期我们的目标是实现一个完整的日期类通过实现日期类的构造函数、运算符重载等等内容加深对前面知识的理解。 实现了日期类之后我们就相当于自己实现了一个网上的日期计算器如下所示 上面的两项功能都是通过我们接下来要进行的运算符重载实现的。 二. 日期类的框架 以下是我们本期实现的日期类的基本框架 class Date { public:// 全缺省的构造函数Date(int year 2023, int month 1, int day 1);// 拷贝构造函数Date(const Date d);// 赋值运算符重载Date operator(const Date d);// 析构函数~Date() {};// 、等算数运算符重载Date operator(int day); //日期天数Date operator(int day); //日期天数Date operator-(int day); //日期-天数Date operator-(int day); //日期-天数// 日期-日期 返回天数,即日期差int operator-(const Date d);// 自增、自减运算符重载Date operator(); //前置Date operator(int); //后置Date operator--(int); //后置--Date operator--(); //前置--// 、、等关系运算符重载bool operator(const Date d); bool operator(const Date d); bool operator (const Date d);bool operator (const Date d);bool operator (const Date d);bool operator ! (const Date d);//打印数据void Print();private:int _year; //年int _month; //月int _day; //日 }; 三. 日期类的实现 3.1 构造函数 构造函数的目的是初始化类对象这里我们只需要实现两种构造函数即可。一种是全缺省的构造函数使用全缺省的构造函数可以让类对象构造时传参更加灵活而另一种则是拷贝构造函数。 全缺省的构造函数 很简单我们只需要判断传入的参数是否符合生活中日期的规则如果符合则正常进行初始化反之则程序退出。规则大致如下 日期规则 1、月份必须在1月到12月之间。例如0月和13月是非法的 2、日份必须在当前月的天数范围内。例如1月32日4月31日是非法的 由于每个月的天数不同尤其是2月还有闰年平年之分故我们可以先写个函数用来获取当前月的天数。这个函数不仅可以用在日份的判断在之后也会经常用到。 // 获取某年某月的天数 int GetMonthDay(int year, int month) {//用一个数组表示平年每月的天数下标表示月份int MouthDayArray[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)) //判断闰年{MouthDayArray[2]; //是闰年2月份天数1}return MouthDayArray[month]; //返回当前月天数 } 有了上面的函数 再根据之前的规则我们很容易就可以写出构造函数 // 全缺省的构造函数 Date(int year 2023, int month 1, int day 1) {if ( month 1 || month 12 || day 1 || day GetMonthDay(year, month)){cout 日期非法 endl;exit(-1);}_year year;_month month;_day day; } 拷贝构造函数 拷贝构造函数就更简单了拷贝构造函数是用已存在的对象初始化新对象故不需要考虑日期是否合法直接拷贝即可如下 // 拷贝构造函数, d2(d1) Date(const Date d) //加const避免d被意外修改使用引用传递是为了提高效率 {_year d._year;_month d._month;_day d._day; } 3.2 析构函数 由于日期类不涉及动态内存管理因此使用编译器自动生成的析构函数即可不需要显式进行实现。  3.3 赋值运算符重载 同理由于日期类不涉及动态内存管理因此只要进行普通的浅拷贝即可编译器默认生成的赋值运算符重载函数即可完成要求。 //赋值运算符重载不需要显式进行实现这里使用编译器默认生成的即可 Date operator(const Date d) {_year d._year;_month d._month;_day d._day;return *this; //返回当前对象的引用为了实现链式访问 } 3.4 关系运算符重载 关系运算符有、、、、以及!我们先来实现运算符。 我们要如何判断一个日期大于另一个日期呢很简单先比较年年相等则比较月月相等则比较日直到比出结果。代码如下 // 运算符重载 bool 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 //前面的条件都不符合说明日期比较小返回false{return false;} } 接下来是运算符这就简单啦看看年月日是否都相等即可  // 运算符重载 bool operator(const Date d) {// 逻辑与下面的条件都符合才返回true否则为falsereturn (_year d._year) (_month d._month) (_day d._day); } 然后是运算符我知道我知道把上面运算符的逻辑都反过来再敲一遍就好啦  这种方法固然可以但未免会显得过于冗余。实际上我们已经实现了运算符和运算符重载那不就是既不大于也不等于嘛我们复用一下之前的重载函数即可如下 // 运算符重载 bool operator(const Date d) {//*this表示当前对象return !((*this d) || (*this d)); //逻辑非之后表示既不大于也不等于 } 通过复用的方法剩下的、和!我们也可以很轻松的写出来如下 // 运算符重载 bool operator(const Date d) {return !(*this d); //复用运算符 }// 运算符重载 bool operator(const Date d) {return !(*this d); //复用运算符 }// !运算符重载 bool operator!(const Date d) {return !(*this d); //复用运算符 } 小贴士实现类中成员函数时并不意味着每个都要将其逻辑完整地写出有些函数之间可以相互复用简化代码。例如上面我们只需实现号和号的重载函数其余的函数直接复用即可。 3.5 日期 /- 天数 接下来我们来实现日期计算器的第一个功能推算几天后的日期。通过重载/-号运算符我们可以实现日期 /- 指定天数 日期  指定天数 首先我们要知道日期的进位规则和我们的十进制不一样。每个月的天数都不同当超过本月的天数月份都要进1并且每过12个月年份都要进1。故我们需要用到之前实现的获取本月天数的函数用来判断是否需要进位。 例如求在12月3号的基础上100天后是几月几号计算过程如下 下面给出示例代码初版  // 日期天数(初版) Date operator(int day) {_day day; //先将天数全部加到_day上//下面开始进行进位while (_day GetMonthDay(_year, _month)) //当_day大于本月的天数说明还需要进行进位继续{//月进位_day - GetMonthDay(_year, _month); //减去当前月的天数_month; //来到下一月//月进位后判断年是否需要进位if (_month 13){_year;_month 1; //进位后月份来到了1月}}return *this; } 不过需要注意的是上面的代码我们对日期进行了修改返回的是修改后的对象故实现的不是号的运算符重载而是运算符的重载。 那如果我们要实现号呢很简单拷贝一份原对象然后对拷贝后的对象复用运算符重载即可这样就不会对原对象进行修改。代码如下 // 日期天数 Date operator(int day) {Date tmp(*this); //拷贝构造一个临时变量tmp day; //复用运算符此时tmp就是加上day后的日期但原对象并没有改变return tmp; //以值的形式返回 } 日期 - 指定天数 实现了推算几天后的日期我们再来实现推算几天前的日期。同样的我们先实现-运算符的重载然后-号运算符进行复用即可。 日期天数是进行进位那么日期-天数就是进行借位、退位二者互为逆过程。有一点需要注意的是退位借的是上一个月的天数故我们需要先让月先减再让天数增加。动图如下 下面是是示例代码初版  // 日期-天数(初版) Date operator-(int day) {_day - day; //先全部减到_day上while (_day 0) //_day小于0说明需要借位进行循环{//月先借位--_month;//月借位后判断年是否需要借位if (_month 0){--_year; //年借位_month 12; //月变为上一年12月}_day GetMonthDay(_year, _month); //将借到的天数进行累加}return *this; } 实现了日期-天数那么日期-天数直接复用即可 // 日期-天数 Date operator-(int day) {Date tmp(*this); //拷贝构造tmp - day; //复用-运算符return tmp; } 细心的小伙伴可能发现了上面我们写的和-运算符重载都是初版是有哪里要改进吗没错其实上面的代码在特殊情况下有出错的风险即用户传入的天数如果是个负数那么最终得到的答案可能就不是我们想要的。但是我们再来看看网上的日期计算器 没错网上的日期计算器对负数有着特殊处理输入负数时则是向前计算即减去相应的天数。故我们可以参考进行实现 // 日期天数(终版) Date operator(int day) {if (day 0) //先判断day的正负{*this - (-day); //为负数则复用-运算符return *this; //直接返回} _day day; //先将天数全部加到_day上//下面开始进行进位while (_day GetMonthDay(_year, _month)) //当_day大于本月的天数说明还需要进行进位继续{//月进位_day - GetMonthDay(_year, _month); //减去当前月的天数_month; //来到下一月//月进位后判断年是否需要进位if (_month 13){_year;_month 1; //进位后月份来到了1月}}return *this; } 对于运算我们通过复用-实现对负数的特殊处理。而对于-运算我们可以复用实现对负数的特殊处理这里就不再展开了。 3.6 自增与自减运算符重载 在上面实现日期天数和日期-天数的基础上我们通过复用可以很轻松地实现自增和自减运算符重载代码如下 // 前置 Date operator() {*this 1; //先1return *this; //再返回返回1后的结果 }// 后置 Date operator(int) //int用于占位表示后置 {Date tmp(*this); //拷贝一份*this 1; //然后1return tmp; //返回1前的结果 }// 前置-- Date operator--() {*this - 1; //先-1return *this; //再返回返回-1后的结果 }// 后置-- Date operator--(int) //int用于占位表示后置-- {Date tmp(*this); //拷贝一份*this - 1; //然后-1return tmp; //返回-1前的结果 } 3.7 日期 - 日期 我们知道日期日期是没有意义的但日期-日期却是很有价值的可以用来获取两个日期之间间隔的天数。故我们最后还要来实现-号运算符的另外一个重载版本用于进行日期-日期的运算。 由于日期类的运算规则较为复杂涉及到每年的天数不同每月的天数不同以及平闰年之分如果采用正常的年-年月-月的方法想想都头大 故我们另辟稀径我们可以先找出较小的那个日期然后让较小的日期不断1用一个变量count来统计1的次数直到较小的日期和较大的日期相等时count的值不就是我们要求的差值嘛代码如下 // 日期-日期 返回天数 //法1年-年月-月日-日太过复杂 //法2找出较小的那个一直累加直到等于大的那个累加的次数就是之间的天数 int operator-(const Date d) {//找出较小的那个日期这里先假设*this较小Date min *this;Date max d;int flag -1; //用于表示最后相减结果的符号if (min max) //假设不成立互换{min d;max *this;flag 1;}//小的进行累加直到二者相等int ret 0; //统计min累加的次数while (max min){min;ret; }return ret*flag; //最终累加的次数即为日期差 } 四. 完整代码  最后给出本期日期类的完整代码需要的读者自取 class Date { public:// 获取某年某月的天数int GetMonthDay(int year, int month){//用一个数组表示平年每月的天数下标表示月份int MouthDayArray[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)) //判断闰年{MouthDayArray[2]; //是闰年2月份天数1}return MouthDayArray[month]; //返回当前月天数}// 全缺省的构造函数Date(int year 2023, int month 1, int day 1){if (month 1 || month 12 || day 1 || day GetMonthDay(year, month)){cout 日期非法 endl;exit(-1);}_year year;_month month;_day day;}// 拷贝构造函数, d2(d1)Date(const Date d) //加const避免d被意外修改使用引用传递是为了提高效率{_year d._year;_month d._month;_day d._day;}//赋值运算符重载不需要显式进行实现使用编译器默认生成的即可Date operator(const Date d){_year d._year;_month d._month;_day d._day;return *this; //返回当前对象的引用为了实现链式访问}// 析构函数~Date() {};// 日期天数Date operator(int day){if (day 0){*this - (-day);return *this;}_day day;while (_day GetMonthDay(_year, _month)){//月进位_day - GetMonthDay(_year, _month);_month;//年进位if (_month 13){_year;_month 1;}}return *this;}// 日期天数Date operator(int day){if (day 0){return *this - (-day) ;}Date tmp(*this); //拷贝构造tmp day; //复用运算符return tmp;}// 日期-天数Date operator-(int day){if (day 0){*this (-day);return *this;}_day - day;while (_day 0){//月让位--_month;//年让位if (_month 0){--_year;_month 12;}_day GetMonthDay(_year, _month);}return *this;}// 前置Date operator(){*this 1; //先1return *this; //再返回返回1后的结果}// 后置Date operator(int) //int用于占位表示后置{Date tmp(*this); //拷贝一份*this 1; //然后1return tmp; //返回1前的结果}// 前置--Date operator--(){*this - 1; //先-1return *this; //再返回返回-1后的结果}// 后置--Date operator--(int) //int用于占位表示后置--{Date tmp(*this); //拷贝一份*this - 1; //然后-1return tmp; //返回-1前的结果}// 运算符重载bool 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 //前面的条件都不符合说明日期比较小返回false{return false;}}// 运算符重载bool operator(const Date d){return (_year d._year) (_month d._month) (_day d._day);}// 运算符重载bool operator(const Date d){//*this表示当前对象return !((*this d) || (*this d)); //逻辑非之后表示既不大于也不等于}// 运算符重载bool operator (const Date d){return !(*this d); //复用运算符}// 运算符重载bool operator (const Date d){return !(*this d); //复用运算符}// !运算符重载bool operator ! (const Date d){return !(*this d); //复用运算符}// 日期-日期 返回天数//法1年-年月-月日-日太过复杂//法2找出较小的那个一直累加直到等于大的那个累加的次数就是之间的天数int operator-(const Date d){//找出较小的那个日期这里先假设*this较小Date min *this;Date max d;int flag -1; //用于表示最后相减结果的符号if (min max) //假设不成立互换{min d;max *this;flag 1;}//小的进行累加直到二者相等int ret 0; //统计min累加的次数while (max min){min;ret;}return ret * flag; //最终累加的次数即为日期差}//打印数据void Print(){cout _year 年 _month 月 _day 日 endl;} private:int _year;int _month;int _day; }; 以上就是本期的全部内容啦 制作不易能否点个赞再走呢
http://www.pierceye.com/news/691825/

相关文章:

  • asp 大型网站开发优化公司治理结构
  • 做外贸 建网站要注意什么ssr网站怎么做
  • 杭州做兼职网站建设老五wordpress
  • 网站建设工资怎么样网站曝光率
  • 亚泰国际建设股份有限公司网站app推广方案模板
  • pathon能做网站开发吗直播网站模板
  • 东莞网站设计网址html怎么添加图片为背景
  • 怎样自己做企业网站网上投诉平台
  • 平价网站建设宝安营销型网站制作
  • 中英网站怎么做seo团队管理系统
  • 做签到的网站上海网站se0优化公司
  • 网站开发技术说明文档网站审核员做点啥
  • 网站设计与网页设计的区别建设部资质查询网站
  • 教育网站制作哪家服务好网站建设运转
  • 山西省轻工建设有限责网站网件路由器无线桥接
  • 做网站 怎么选择公司wordpress lnmp1.4
  • 网站建设价格标准科技感设计感的展厅
  • 广州番禺建设银行网站登录做摄影网站的目的
  • 前端外包网站php网站开发哪个好
  • 网站开发与维护好找工作吗网站建设招标书模板
  • 浙江金顶建设公司网站房产获客软件
  • 什么网站比较容易做python做网站服务器
  • 东城网站建设微信小程序商店怎么开
  • 企业网站源码千博网站推广怎么做流量大
  • 福州最好的网站建设服务商浙江华临建设集团有限公司网站
  • cdr 做网站支付宝小程序开发者工具
  • 建一个全部由自己控制的网站需要多少钱手机网站大全
  • 酒店电子商务网站策划书网站排名下降的原因
  • 成都网站制作公司报价成都装修公司哪家好
  • 用自己的电脑做网站需要备案吗wordpress rss教程