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

【C++】类和对象--一篇带你解决运算符重载实例--日期类

本篇文章我们将实现下面下面这些函数接口:

代码语言:javascript

AI代码解释

class Date { public: // 获取某年某月的天数 int GetMonthDay(int year, int month); // 全缺省的构造函数 Date(int year = 1900, int month = 1, int day = 1); // 拷贝构造函数 //d2(d1) Date(const Date& d); // 赋值运算符重载 // d2 = d3 -> d2.operator=(&d2, d3) Date& operator=(const Date& d); // 析构函数 ~Date(); // 日期+=天数 Date& operator+=(int day); // 日期+天数 Date operator+(int day); // 日期-天数 Date operator-(int day); // 日期-=天数 Date& operator-=(int day); // 前置++ Date& operator++(); // 后置++ Date operator++(int); // 后置-- Date operator--(int); // 前置-- Date& operator--(); // >运算符重载 bool operator>(const Date& d); // ==运算符重载 bool operator==(const Date& d); // >=运算符重载 inline bool operator >= (const Date& d); // <运算符重载 bool operator < (const Date& d); // <=运算符重载 bool operator <= (const Date& d); // !=运算符重载 bool operator != (const Date& d); // 日期-日期 返回天数 int operator-(const Date& d); private: int _year; int _month; int _day; };

我们可以采用多文件的形式储存:


1. 全缺省的构造函数

构造函数其实就是初始化的一个过程,尤其注意的是对于日期的一个合法性的判断。但是因为月份的天数的细微差距,这里调用一个GetMonthDay()函数接口来完成:

代码语言:javascript

AI代码解释

int Date::GetMonthDay(int year, int month) { assert(year >= 0 && month < 13 && month>0); //开辟一个静态区间,用来解决不同月份的天数不同 static int monthDayAraay[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; if (month == 2 && isLeapYear(month)) { return 29; } return monthDayAraay[month]; }

这里因为月份对应的天数是固定的,所以我们选择将每个月的天数储存在一个静态数组中,这样一来就可以做到一次的开辟,之后可以进行多次的调用

同时因为二月天数收年份影响,所以这里继续编写一个判断是都为闰年的函数接口isLeapYear(),如果十二月份并且是闰年则直接返回29:

代码语言:javascript

AI代码解释

bool isLeapYear(int year) { return (year % 100 != 0 && year % 4 == 0) || (year % 400 == 0); }

上面就是我们应该在构造函数中进行的日期是否合法的判断,所以我们最终的构造函数应该是:

代码语言:javascript

AI代码解释

Date::Date(int year, int month, int day) { if (year > 0 && month < 13 && month>0 && day > 0 && day <= GetMonthDay(year,month)) { _year = year; _month = month; _day = day; } else { cout << "日期不合翻!" << endl; exit(-1); } }

2. opeartor ==

判断两个日期是否相等很简单,只需要将年月日的比较结果进行与逻辑判断即可:

代码语言:javascript

AI代码解释

bool Date::operator == (const Date & d) { return _year == d._year && _month == d._month && _day == d._day; }

3. operator <

要想判断日期<日期:

  • 先比较year,如果year小的话,后面就无须比较了,直接返回ture
  • 如果year相等,就比较month,如果month小的话,后面也无须比较,直接返回ture
  • 如果year、month都相等时,最后才比较day,如果day小,直接返回ture
http://www.jsqmd.com/news/487164/

相关文章:

  • 2026年南京靠谱装修公司推荐 南京装修公司口碑排行与避坑指南 - 资讯焦点
  • 构建生产级 AI Agent 系统的4大主流技术:反思、工具、规划与多智能体协作
  • Gemini 2.5 Pro代码实战评测:用C语言双缓冲日志案例验证其推理能力是否真比GPT-4强?
  • GLM-5-Turbo完全指南2026:中国新世代前沿AI模型
  • 【C++】一篇带你了解C++中的动态内存管理
  • 无刷VS有刷:电站清洁机器人硬件选型破局,解锁运维效率新范式
  • 徐林:龙骧锋会的稳健基石与敏锐操盘手 - 资讯焦点
  • 宁夏大型钢结构加工哪家靠谱?资质、专业、口碑三维度精选指南 - 宁夏壹山网络
  • 【C++】类和对象--日期类Date补充及流提取、流插入
  • 【2026年最新600套毕设项目分享】springboot躲猫猫书店管理系统(14147)
  • 从送快递到月薪8K+:杭州笃行好未来教育科技有限公司如何让“零基础”学员实现职业跃迁 - 资讯焦点
  • **发散创新:用Python构建可解释的AI监管框架——从代码到合规实践**在人工智能快速落地的今天,模型透明度与责任归属成为行业焦点。
  • Ubuntu 20.04配置网络
  • 【2026年最新600套毕设项目分享】springboot房产租赁管理系统(14148)
  • 2026实测减肥保健品排名前十名产品!减肥胶囊什么牌子有效果?科学减重不伤身 - 资讯焦点
  • 【MySQL 的 ONLY_FULL_GROUP_BY 模式】
  • 基于微信小程序的药店商城管理系统Python-flask
  • YOLO11 改进 - 主干网络_ 清华大学CloFormer AttnConv :利用共享权重和上下文感知权重增强局部感知,注意力机制与卷积的完美融合
  • 简单工厂模式和策略模式的区别
  • YOLO11 改进 - 主干网络_ RepViT重访移动端CNN的ViT视角:轻量级设计分离Token与Channel混合器,优化移动端实时检测
  • python 生成与安装 inquirement
  • 探索MATLAB下综合能源系统优化调度:阶梯式碳与供需灵活双响应的奇妙之旅
  • 轻松掌握C语言中的大小写字母转换
  • YOLO11 改进 - 主干网络_ SwinTransformer 移位窗口层次化视觉变换器:层次化特征提取增强多尺度目标感知,优化复杂场景检测
  • 新手也能上手!备受喜爱的降AI率工具 —— 千笔·降AI率助手
  • 【Azure Key Vault】下载Key Vault中保存证书的PFX文件报错问题分析
  • 空间栅格化(体素化)及射线选择原理
  • 【2026年最新600套毕设项目分享】springboot房屋交易系统(14149)
  • **发散创新:基于Python的脉冲神经网络模拟与实时计算优化实践**
  • 爱心捐赠系统,公益捐赠系统, 基于SpringBoot3+vue3的原创精品,适用于毕业设计、实习项目、学习项目