简单实现日期计算器

目录:

  • Date.h实现函数声明
  • Date.c实现函数功能
    • 构造函数
    • 六个比较函数
    • 日期 + 天数
    • 日期 - 天数
    • 日期 - 日期
    • 操作符++
    • 操作符--
    • 获取每月的天数

🚘正片开始

Date.h头文件中实现函数声明

#pragma once
#include<iostream>
using namespace std;
class Date
{friend istream& operator>>(istream& in, Date& d);public://构造函数Date(size_t year = 1970, size_t month = 1, size_t day = 1);//打印数据void Print_Date();//日期的比较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);//日期加天数Date operator+(int day);Date& operator+=(int day);//日期减天数Date operator-(int day);Date& operator-=(int day);//日期减日期int operator-(Date& d);//前置++Date& operator++();//后置++Date operator++(int);//日期--//前置--Date& operator--();//后置--Date operator--(int);//每月多少天(因为此函数会经常使用所以定义在类中,为内敛函数)int Month_Day(size_t year, size_t month){static int DayArr[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 DayArr[month];}private:size_t _year;size_t _month;size_t _day;
};
构造函数
此构造函数为全缺省
Date::Date(size_t year, size_t month, size_t day)
{_year = year;_month = month;_day = day;
}

注意:此处是头文件和源文件分开写的,所以函数声明只需在头文件声明即可

六个比较函数

在这七个比较函数中,只需要先写 <== 其他比较函数直接进行复用即可轻松解决。

  1. 重载小于函数
bool Date::operator<(Date d)
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if(_month==d._month){return _day < d._day;}}return false;
}

这里的小于函数实现原理是:

如果 *this 年小就返回 true , *this 年等就判断月,如果 *this 月小就返回true, *this 月等就判断天数,如果 *this 的天数小则返回 true 否则其他情况一律返回false

  1. 重载 == 函数
bool Date::operator==(Date d)
{return (_year==d._year)&&(_month==d._month)&&(_day==d._day);
}

下面的比较函数直接可以复用上面的两个函数使其实现函数难度大大降低,是一种非常巧妙的写法

  1. 重载 <= 函数
bool Date::operator<=(Date d)
{return (*this)<d || (*this)==d;
}

实现 <= 无非就是 <== 的其中一种情况 只需用一个或运算符连接即可完成此函数

  1. 重载 > 函数
bool Date::operator>(Date d)
{return !((*this) <= d);
}

实现 > 无非就是 <= 的反面 所以只需要对 <= 函数取反即可完成此函数

  1. 重载 >= 函数
bool Date::operator>=(Date d)
{return !((*this) < d);
}

实现 >= 无非就是 < 的反面 所以只需要对 < 函数取反即可完成此函数

  1. 重载 != 函数
bool Date::operator!=(Date d)
{return !((*this)==d);
}

实现 != 无非就是 == 的反面 所以只需要对 == 函数取反即可完成此函数

日期 - 天数
  1. 日期+天数
Date Date::operator+(int day)
{Date tmp(*this);if (day < 0){tmp -= (-day);}else{tmp += day;}return tmp;
}

函数里面的if语句是为了避免day为负数的情况,如果为负数则变成了 d-天数 原本应该是 d+天数 的为了让他传负数也能实现,我们复用了 -= 函数重载

  1. 日期+=天数
Date& Date::operator+=(int day)
{//为了避免day为负数造成*this-=day,所以我们复用了-=函数重载让它依旧可以实现相应的功能if (day < 0){*this -=  (- day);return *this;}_day += day;while (_day > Month_Day(_year, _month)){_day -= Month_Day(_year, _month);_month++;if (_month == 13){_year++;_month = 1;}}}
日期 - 天数
  1. 日期 - 天数
Date Date::operator-(int day)
{Date tmp(*this);if (day < 0){tmp += (-day);}else{tmp -= day;}return tmp;
}

小知识点:因为tmp为临时变量出了函数会被销毁,通常我们函数返回值会避免拷贝的发生通常使用引用返回,但是在这个地方无法使用引用是因为tmp为临时变量

  1. 日期 -= 天数
void Date::operator-=(int day)
{if (day < 0){*this += (-day);return;}_day -= day;while (_day <= 0){_month--;if (_month == 0){_year--;_month = 12;}_day += Month_Day(_year, _month);}
}
日期 - 日期
//假设是*this-d;
int Date::operator-(Date& d)
{//先假设*this>dDate max = *this;Date min = d;int count = 0;int flag = 1;//如果不是*this>dif (*this < d){max = d;min = *this;flag = -1;}while (min < max){++min;++count;}return count*flag;
}
操作符 ++
  1. 前置 ++
Date& Date::operator++()
{*this += 1;return *this;
}
  1. 后置 ++
Date Date::operator++(int)
{Date tmp(*this);*this += 1;return tmp;
}

由于 前置++ 和 后置++ 在函数上无法区别,所以c++创始人规定后置++ 函数括号内必须带一个 int 类型来进行区分,其实也可以把 前置++ 函数 和 后置++ 函数 理解为是运算符重载

操作符 --
  1. 前置 --
Date& Date::operator--()
{*this -= 1;return *this;
}
  1. 后置 --
Date Date::operator--(int)
{Date tmp(*this);*this -= 1;return tmp;
}
获取每月的天数
int Month_Day(size_t year, size_t month)
{//每月的天数static int DayArr[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 DayArr[month];
}

单独把这个函数拿出来是因为此函数比较特别,因为这函数会经常使用所以定义在类中,为内敛函数。

大家可能对内敛函数比较陌生在此我给大家讲解一下内敛的好处👇

在一个类中定义的函数会被默认为内敛函数,前提是此函数代码量不多,因为大家都知道函数被调用的时候会建立栈帧,会消耗一定的空间和时间,如果编译器识别这个函数为内敛函数,编译器会自动展开函数,不调用函数栈帧 ,从而降低了时间和空间的消耗

接下来我们来讲讲获取天数的函数中的一些小细节

数组用static修饰是为了不让数组多次创建造成效率的浪费,定义13个元素是为了月份对应上下标

总结:本章主要是对运算符重载的应用,写个日期类的项目加强我们对知识点的记忆,本章也涉及到了一些小细节,需要细细斟酌,才能领悟,加油铁子们!!!


🎉🎉🎉完结

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

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

相关文章

javamail发送qq邮箱失败案例分析

文章目录 javaMail报错:Unsupported or unrecognized SSL message原因分析: ssl与tls端口总结 javaMail报错:Unsupported or unrecognized SSL message c.n.m.service.impl.EmailServiceImpl : 邮件发送异常, Mail server connection failed; nested exception is javax.m…

SqlSessionFactory

在Java中&#xff0c;SqlSessionFactory是MyBatis框架中的一个重要类&#xff0c;它用于创建SqlSession对象。SqlSession是MyBatis框架中用于执行SQL语句的主要对象&#xff0c;它提供了对数据库操作的各种方法。 SqlSessionFactory的主要作用是创建SqlSession对象&#xff0c…

Linux 解压报错

在linux上面解压压缩包&#xff0c;有可能遇到一下问题&#xff0c;现提供正确语句供参考 一、tar命令解压.zip文件 在使用tar命令解压.zip格式文件时&#xff0c;有时会遇到一下异常 gzip: stdin has more than one entry--rest ignored tar: Child returned status 2 ta…

Spring AI 来啦,快速上手

Spring AI Spring框架在软件开发领域&#xff0c;特别是在Java企业级应用中&#xff0c;一直扮演着举足轻重的角色。它以其强大的功能和灵活的架构&#xff0c;帮助开发者高效构建复杂的应用程序。而Spring Boot的推出&#xff0c;更是简化了新Spring应用的初始搭建和开发过程…

【分治算法】【Python实现】棋盘覆盖

文章目录 [toc]问题描述分治算法时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;分治算法 学习指南&#xff1a;Python学习指南 问题描述 在一个 2 k 2 k 2^{k} \times 2^{k} 2k2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&…

httpClient提交报文中文乱码

httpClient提交中文乱码&#xff0c;ContentType类型application/json 指定提交参数的编码即可 StringEntity se new StringEntity(paramBody.toJSONString(),"UTF-8");se.setContentType("application/json");context.httpPost.setHeader("Cookie&…

【算法模版】基础算法

文章目录 快速排序算法模板归并排序算法模板整数二分算法模板浮点数二分算法模板高精度加法、减法、乘法、除法高精度加法高精度减法高精度乘低精度高精度除以低精度前缀和与差分一维前缀和二维前缀和一维差分二维差分位运算双指针算法离散化区间合并 快速排序算法模板 快速排…

JUC并发-共享模型-无锁-乐观锁(非阻塞)

1、问题提出 有如下需求&#xff0c;保证 account.withdraw 取款方法的线程安全 public class TestAccount {public static void main(String[] args) {Account account new AccountCas(10000);Account.demo(account);} }class AccountUnsafe implements Account {private I…

2024LarkXR新增功能系列之五 | 单端口支持多并发

实时云渲染技术在为虚拟现实、游戏、和各种应用程序提供强大的渲染支持的同时&#xff0c;也带来了一些网络和运维上的挑战。在传统的设置中&#xff0c;实时云渲染推流技术需要为每个视频流单独占用服务器的一个端口。这种方法在多用户同时访问的情况下可能会导致端口资源的快…

MemFire解决方案-物联网数据平台解决方案

方案背景 随着各种通讯、传感技术发展&#xff0c;数据通讯成本的急剧下降&#xff0c;数以万亿计的智能设备&#xff08;智能手环、智能电表、智能手机、各种传感器设备等&#xff09;接入网络&#xff0c;并源源不断的产生海量的实时数据。这些海量数据的价值挖掘&#xff0…

Node私库Verdaccio使用记录,包的构建,推送和拉取

Node私库Verdaccio使用记录&#xff0c;包的构建&#xff0c;推送和拉取 Verdaccio是一个轻量级的私有npm代理注册中心&#xff0c;它可以帮助你在本地搭建一个npm仓库&#xff0c;非常适合企业内部使用。通过使用Verdaccio&#xff0c;你可以控制和缓存依赖包&#xff0c;提高…

【MHA】MySQL高可用MHA介绍6-后台运行与管理多套集群

1 后台运行 默认情况下&#xff0c;masterha_manager在前台运行。您可以将masterha_manager程序在后台运行&#xff0c;如下所示。 manager_host$ nohup masterha_manager --conf/etc/app1.cnf < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &设置no…

边OTG边充电芯片LDR6500

随着科技的飞速发展&#xff0c;智能移动设备已成为我们生活中不可或缺的一部分。而在这些设备的连接与数据传输中&#xff0c;Type-C接口以其高效、便捷的特性逐渐占据了主导地位。OTG&#xff08;On-The-Go&#xff09;技术则进一步扩展了Type-C接口的功能&#xff0c;使得设…

特征提取(Feature Extraction)应用场景笔记(二)

让我们以一个交通管理系统为例&#xff0c;说明如何基于统计特征、频域特征和时域特征设计数据表示。 假设我们有大量的交通流量数据&#xff0c;包括车辆的速度、密度、道路拥堵情况等指标。我们的任务是让强化学习代理学习交通流量模式&#xff0c;并根据数据做出智能的交通信…

构建安全高效的数字货币钱包:开发指南

在加密货币领域的蓬勃发展中&#xff0c;数字货币钱包成为了连接用户与区块链的重要桥梁。作为存储、发送和接收加密资产的工具&#xff0c;数字货币钱包的安全性和效率至关重要。本文将介绍如何构建一个安全高效的数字货币钱包&#xff0c;并提供开发指南&#xff0c;帮助开发…

2024中国(江西)国际先进陶瓷材料及智能装备博览会

2024中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会 “中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会” 陶瓷三新展 &#xff08;新材料、新装备、新技术&#xff09; 绿色智能、引领未来 2024年11月1日-11月3日 中国江西 南昌…

深度学习系列64:数字人wav2lip详解

1. 整体流程 第一步&#xff0c;加载视频/图片和音频/tts。用melspectrogram将wav文件拆分成mel_chunks。 第二步&#xff0c;调用face_detect模型&#xff0c;给出人脸检测结果&#xff08;可以改造成从文件中读取&#xff09;&#xff0c;包装成4个数组batch&#xff1a;img…

html显示PDF并兼容IE浏览器的解决方案

方案一、vue-pdf插件 缺点&#xff1a;IE11显示空白&#xff0c;编译后的Edge测试环境可以正常线上&#xff0c;打到线上报错&#xff0c;谷歌和百分浏览器显示完美 1、vue 只显示核心代码&#xff0c;需要安装vue-pdf插件 <vue-pdf :src"ivcPdfUrl"></v…

交换机的八大功能

VLAN(Virtual Local Area Network&#xff0c;虚拟局域网)&#xff0c;逻辑上将设备隔离成不同局域网&#xff0c;不受物理线路的限制。不同VLAN之间互相隔离 优点 ①有效控制广播域范围; ②增强局域网的安全性; ③灵活构建虚拟局域网。 02端口隔离 端口隔离功能可以限制一个…

Spring声明式事务(@Transactional)原理之-ProxyTransactionManagementConfiguration

文章目录 目录 文章目录 前言 一、切入点以及切面的匹配规则 1.1 TransactionAttributeSourcePointcut事务的切入点匹配 二、TransactionInterceptor切面的具体逻辑 2.1 声明式事务实现的具体逻辑 总结 前言 上一篇文章已经说过了声明式事务的原理其实就是SpringAop动态…