【C++初阶】系统实现日期类

目录

一.运算符重载实现各个接口

1.小于 (d1)<>

2.等于 (d1=d2)

3.小于等于(d1<=d2)

4.大于(d1>d2)

5.大于等于(d1>=d2) 

6.不等于(d1!=d2) 

7.日期+=天数 

(1) 算该年的每个月的天数

(2)日期+=天数 函数 

8.日期+天数

(1)拷贝构造形式 

(2)复用形式 

9.日期-=天数 

10.日期-天数 

11.实现operator++函数 

(1)前置++

(2)后置++ 

12.日期-日期

 13.流插入运算符重载

14.流提取操作符重载 

15.检查函数(防止日期错误) 


一.运算符重载实现各个接口

1.小于 (d1<d2)

bool Date::operator<(const Date& d)
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){if (_day < d._day){return true;}}}return false;
}

2.等于 (d1=d2)

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

3.小于等于(d1<=d2)

 由于已经实现了小于和等于的接口,接下来我们直接复用让代码更加简洁。

bool Date::operator<=(const Date& d) 
{return *this < d || *this == d;
}

4.大于(d1>d2)

bool Date::operator>(const Date& d)
{return !(*this <= d);
}

5.大于等于(d1>=d2) 

bool Date::operator>=(const Date& d)
{return !(*this < d);
}

6.不等于(d1!=d2) 

bool Date::operator!=(const Date& d)
{return !(*this == d);
}

7.日期+=天数 

  • 计算方式 

 

 

(1) 算该年的每个月的天数

//不进行声明和定义分离,本质就是inline(这个函数在后面会被频繁调用)int GetMonthDay(int year, int month){assert(month > 0 && month < 13);static int monthDays[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)){return 29;}return monthDays[month];}

(2)日期+=天数 函数 

//d1 += 10
Date& Date:: operator+=(int day)
{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;
}

8.日期+天数

(1)拷贝构造形式 

//d1+10
Date Date:: operator+(int day)
{Date tmp(*this);//这里*this就是d1----(拷贝构造)tmp._day += day;while (_day > GetMonthDay(tmp._year, tmp. _month)){tmp._day -= GetMonthDay(tmp._year, tmp._month);++tmp._month;if (tmp._month == 13){++tmp._year;tmp._month = 1;}}return tmp;
}

(2)复用形式 

Date Date:: operator+(int day)
{Date tmp = *this;//拷贝构造tmp += day;return tmp;

9.日期-=天数 

  •  计算方式

 

//日期-=天数
Date& Date::operator-=(int day)
{_day -= _day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}

10.日期-天数 

Date Date::operator-(int day)
{Date tmp = *this;tmp = day;return tmp;
}

11.实现operator++函数 

(1)前置++

//++d->d.operator++()
Date & Date::operator++()
{*this += 1;return *this;
}

(2)后置++ 

//为了和前置++区分,强制增加了一个int形参,构成重载区分
// d++ ->d.operator++(0)
Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}

12.日期-日期

//日期-日期 d1-d2
int  Date::operator-(const Date & d)
{int flag = 1;Date max = *this;Date min = d;if (*this < d){int flag = -1;max = d;min = *this;}int n = 0;while (min != max){++min;++n;}return n * flag;
}

 13.流插入运算符重载

由于  <<  只支持内置类型,所以我们需要自己写一个函数来支持自定义类型的流插入。

ostream& operator<<(ostream& cout, const Date& d)
{cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;return cout;
}operator<<(cout, d1);
cout << d1 << d2;
  • 注意
  1. 该函数不能写成成员函数,只能放在全局。因为操作符左右两侧操作数的类型不匹配。
  2. 该函数不能放在Date.h文件中。因为要在两个.cpp文件中包含Date.h头文件,产生定义冲突,解决方法有两个:第一,采用内联的形式;第二,采用声明和定义分离。 

 

14.流提取操作符重载 

//流提取
istream& operator>>(istream& in, Date& d)
{cout << "请依次输入年、月、日";in >> d._year >> d._month >> d._day;return in;
}int main()
{cin >> d2 >> d1;cout << d2 << d1;
}

 

15.检查函数(防止日期错误) 

bool Date::CheckInvalid()
{if (_year <= 0||_month<1||_month>12||_day<1||_day>GetMonthDay(_year,_month)){return false;}else{return true;}
}
  • 流提取改进 
//流提取
istream& operator>>(istream& in, Date& d)
{while (1){cout << "请依次输入年、月、日: ";in >> d._year >> d._month >> d._day;if (!d.CheckInvalid()){cout << "输入了非法日期,请重新输入" << endl;}else{break;}}return in;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++:蓝桥杯的基础算法2(构造,模拟)+练习巩固

目录 构造 构造的基础概念&#xff1a; 模拟 练习1&#xff1a;扫雷 练习2&#xff1a;灌溉 练习3&#xff1a;回文日期 构造 构造的基础概念&#xff1a; 构造算法是一种用于解决特定问题的算法设计方法。在C语言中&#xff0c;构造算法通常涉及到创建一个函数或类来实…

PMP考试100个主要知识点

1.一个项目在启动阶段会进行量级估算&#xff0c;准确范围是-50至100%。2000版的量级估算准确度为&#xff1a;-25%到75%。 2.质量控制通常先于范围确认执行&#xff0c;但这两个过程可以并列进行参考 3.Cost-plus-fixed-fee(CPFF)成本加固定费用合同。成本补偿型合同包括成本加…

Vue 封装的 axios 类的使用(小bug 改进)

http类 import { baseUrl } from "./config"; //引入config.js中的配置 import axios from "axios"; //引入axios import qs from "querystringify"; //form-Data请求时的工具类class Http{axios null;lastRequestIntercept null…

华为OD机试真题-最大坐标值-2023年OD统一考试(C卷)--Python--开源

题目&#xff1a; 考察内容&#xff1a; for if 异常处理细节&#xff08;负数-1&#xff0c; 指令为0&#xff0c;且幸运数为0&#xff0c;不进不退&#xff09; 代码&#xff1a; """ 题目分析&#xff1a; 异常处理&#xff1a;try -except 当指令为0&am…

【OpenFeign常用配置】

OpenFeign常用配置 快速入门&#xff1a;1、引入依赖2、启用OpenFeign 实践1、引入依赖2、开启连接池功能3、模块划分4、日志5、重试 快速入门&#xff1a; OpenFeign是一个声明式的http客户端&#xff0c;是spring cloud在eureka公司开源的feign基础上改造而来。其作用及时基于…

二.西瓜书——线性模型、决策树

第三章 线性模型 1.线性回归 “线性回归”(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记. 2.对数几率回归 假设我们认为示例所对应的输出标记是在指数尺度上变化&#xff0c;那就可将输出标记的对数作为线性模型逼近的目标&#xff0c;即 由此&…

30个AI变现案例,太全了,赶紧实操起来

精心整理了30个AI变现案例&#xff0c;每一个都可以作为一个完整的副业去实践&#xff0c;AI时代已经来了&#xff0c;所有不甘于现状的朋友&#xff0c;都应该去下场&#xff0c;先把手弄脏&#xff0c;不要怕&#xff0c;实践起来&#xff01; 1&#xff0e;【副业创业】AI剧…

Spring6学习技术|Junit

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; Junit 背景 背景就是每次Test都要重复创建容器&#xff0c;获取对象。就是ApplicationContext和getBean两个语句。通过Spring整合Junit&#xff0c;可以…

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…

Linux 上安装及卸载JDK(包含yum方式)

一、 删除JDK 1、先输入java -version查看是否安装了JDK [rootiZbp117bkiezirqkean6g3Z java-11-openjdk-11.0.21.0.9-2.0.3.al8.x86_64]# java -version openjdk version "11.0.21" 2023-10-17 LTS OpenJDK Runtime Environment (Red_Hat-11.0.21.0.9-1) (build 1…

2024牛客(4)K题

登录—专业IT笔试面试备考平台_牛客网 using i64 long long; using ll long long; constexpr ll M 1e9 7; template<class Info> struct SegmentTree {int n;std::vector<Info> info;SegmentTree() : n(0) {}SegmentTree(int n_, Info v_ Info()) {init(n_, …

堆的结构实现与应用

目录 前言: 1.认识堆 a.如何认识堆&#xff1f; b.大根堆与小根堆 c.堆应用的简单认识 2.堆的结构与要实现的功能 3.向上调整算法 4.向下调整算法 5.向堆插入数据并建堆 6.堆的大小 7.堆的判空 8.取堆顶数据 9.删除堆顶数据 10.向上调整时间复杂度 11.向下调整时…