C++ 日期计算器

日期计算器

        • 概要
    • Date类的规划
    • Date类的实现
      • Date 构造函数
      • Date 拷贝构造函数
      • ~Date 析构函数
      • GetMonthDay 求某年某月的天数
      • operator= 赋值操作符重载
      • operator+= 加等操作符重载
      • operator+ 加号操作符重载
      • operator-= 减等操作符重载
      • operator- 减法操作符重载 (日期 - 天数)
      • operator++ 前置自增操作符重载
      • operator++ 后置自增操作符重载
      • operator-- 前置自减操作符重载
      • operator-- 后置自减操作符重载
      • operator< 小于操作符重载
      • operator== 相等操作符重载
      • operator!= 不等操作符重载
      • operator<= 小于或等于操作符重载
      • operator> 大于操作符重载
      • operator>= 大于或等于操作符重载
      • operator- 减法操作符重载(日期 - 日期)
      • Print 打印函数
    • Date 类的测试
      • 测试操作符重载(+,+=,- ,-=,x++,++x,x--,--x)
      • 测试操作符重载(>,>=,==,<,<=,!=)
      • 测试操作符重载(日期 - 日期)
        • 结语

请添加图片描述

概要

本篇主要探究C++ 实现日期计算器

Date类的规划

class Date
{
public:int GetMonthDay(int year, int month);Date(int year = 2024 , int month = 2, int day = 6);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);Date& operator++();Date operator++(int);Date operator--(int);Date& operator--();bool operator>(const Date& d) const;bool operator==(const Date& d) const;bool operator>= (const Date& d) const;bool operator< (const Date& d) const;bool operator<= (const Date& d) const;bool operator!= (const Date& d) const;int operator-(const Date& d) const;void Print();private:int _year;int _month;int _day;
};

Date类的实现

Date 构造函数

Date::Date(int year, int month, int day):_year(year), _month(month), _day(day)
{ }

构造函数,他是在创建类的时候调用进行初始化操作,我们这里声明与定义分离,所以它的参数不需要填写缺省值,缺省值在声明的时候定义即可。

Date 拷贝构造函数

Date::Date(const Date& x):_year(x._year), _month(x._month), _day(x._day)
{ }

拷贝构造函数和构造函数作用相似,拷贝构造函数是将已有的类的对象拷贝给新创建的类的对象,如上所示。

~Date 析构函数

Date::~Date()
{_year = _month = _day = 0;
}

构析函数是在对象即将销毁前所调用的函数,常用来清理数据空间,这里我们的内存都在栈上申请的,所以影响不大。

GetMonthDay 求某年某月的天数

int Date::GetMonthDay(int year,int month)
{int a[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 a[month];
}

该函数是用来求某年某月的月份天数,通过创建一个大小为13的数组a, 再对二月份进行判断闰年来确定是否为特殊情况,否则返回已设定好的月份天数。

operator= 赋值操作符重载

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

该函数用于对象与对象之间的赋值操作,在对象的年月日进行逐一复制后并返回this指针的解引用。

operator+= 加等操作符重载

Date& Date::operator+=(int day)
{_day+=day;int time=GetMonthDay(_year,_month);while(_day>time){_day-=time;_month++;if(_month>12){_month-=12;_year++;}time = GetMonthDay(_year,_month);}return *this;
}

该函数用于日期与天数的相加,在实现该函数时先将this->_day加上想加的day。然后再通过月份的天数以及月与年的关系进行调整,如上所示。

operator+ 加号操作符重载

Date Date::operator+(int day)
{Date newdate = *this;newdate+=day;return newdate;
}

通过复用加等操作符重载,在不改变*this的情况下,返回相加后的对象

operator-= 减等操作符重载

Date& Date::operator(int day)
{_day-=day;int time =GetMonthDay(_year,_month)while(_day>=0){_day+=time;_month--;if(_month<=1){_month+=12;_year--;}time=GetMonthDay(_year,_month);} return *this;
}

该函数和加等操作符重载类似,先将this->_day减去day,然后进行月份的天数和年与月之间的调整即可。

operator- 减法操作符重载 (日期 - 天数)

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

通过复用减等操作符重载,在不改变*this的情况下,返回相加后的对象

operator++ 前置自增操作符重载

Date& Date::operator++()
{(*this)+=1;return *this;
}

operator++ 后置自增操作符重载

Date Date::operator--(int)
{Date a = *this;(*this)+=1;return a;
}

operator-- 前置自减操作符重载

Date& Date::operator--()
{	(*this)-=1;return *this;
}

operator-- 后置自减操作符重载

Date Date::operator--(int)
{	Date a=*this;(*this)-=1;return a;
}

operator< 小于操作符重载

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

operator== 相等操作符重载

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

operator!= 不等操作符重载

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

operator<= 小于或等于操作符重载

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

operator> 大于操作符重载

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

operator>= 大于或等于操作符重载

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

operator- 减法操作符重载(日期 - 日期)

int operator-(const Date& date) const
{Date max = *this,min = date;int flag=(max>=min);if(!flag){max=date;min=*this;flag=-1;}int count=0;while(max>min){min++;count++;}return flag*count;
}

通过比较选出最大的日期max与最小的日期min,让最小的日期min和记录数的count进行循环自增,直到max与min相等为止,此时刻的count就是相差的天数,而flag先前用于比较的就是它的符号,所以返回flag*count。

Print 打印函数

void Date::Print()
{printf("%d %d %d\n",_year,_month,_day);
}

Date 类的测试

测试操作符重载(+,+=,- ,-=,x++,++x,x–,–x)

void Test_1()
{std::cout << "Test_1:\n";Date a(2024, 2, 6);std::cout << "a ||";a.Print();Date b = a;std::cout << "b ||";b.Print();b += 30;std::cout << "b += 30 ||";b.Print();a -= 20;std::cout << "a -= 20 ||";a.Print();Date c = b - 30;std::cout << "c 或 b - 30 ||";c.Print();Date d = a + 20;std::cout << "d 或 a + 20 ||";d.Print();d++;std::cout << "++d ||";d.Print();c--;std::cout << "++c ||";c.Print();Date e = a++;std::cout << "e = a++ -> e||";e.Print();std::cout << "e = a++ -> a||";a.Print();Date f = a++;std::cout << "f = b-- -> f||";f.Print();std::cout << "f = b-- -> b||";b.Print();std::cout << "\n";
}

运行结果如下:
在这里插入图片描述

测试操作符重载(>,>=,==,<,<=,!=)

void Test_2()
{std::cout << "Test_2:\n";Date a(2024, 2, 6);std::cout << "a ||";a.Print();Date b = a + 999;std::cout << "b ||";b.Print();Date c = a - 999;std::cout << "c ||";c.Print();Date d = a;std::cout << "d ||";d.Print();std::cout << "a < b  ->" << (a < b) << std::endl;std::cout << "a > b  ->" << (a > b) << std::endl;std::cout << "a == b ->" << (a == b) << std::endl;std::cout << "a != b ->" << (a != b) << std::endl;std::cout << "a < c  ->" << (a < c) << std::endl;std::cout << "a > c  ->" << (a > c) << std::endl;std::cout << "a == c ->" << (a == c) << std::endl;std::cout << "a != c ->" << (a != c) << std::endl;std::cout << "a == d ->" << (a == d) << std::endl;std::cout << "a != d ->" << (a != d) << std::endl;std::cout << "a >= d ->" << (a >= d) << std::endl;std::cout << "a <= d ->" << (a <= d) << std::endl;std::cout << "a < d  ->" << (a < d) << std::endl;std::cout << "a > d  ->" << (a > d) << std::endl;std::cout << "\n";
}

运行结果如下:
在这里插入图片描述

测试操作符重载(日期 - 日期)

void Test_3()
{std::cout << "Test_3:\n";Date a(2024, 2, 6);Date b(2025, 2, 6);Date c = a + 99;std::cout << "c ||";c.Print();std::cout << "a ||";a.Print();std::cout << "b ||";b.Print();std::cout << "a - b ||" << (a - b) << std::endl;std::cout << "b - b ||" << (b - b) << std::endl;std::cout << "b - a ||" << (b - a) << std::endl;std::cout << "c - a ||" << (c - a) << std::endl;std::cout << "a - c ||" << (a - c) << std::endl;std::cout << "\n";
}

运行结果如下:
在这里插入图片描述
测试完毕,综合上述代码及运行结果,可得代码正确,可以正常模拟日期计算器。

结语

以上就是本期的全部内容了,喜欢就多多关注吧!!!

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

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

相关文章

UE4 C++创建摄像机摇臂和相机并且设置Transform

新建MyPawn C类 .h #include "GameFramework/SpringArmComponent.h" //SpringArm组件 #include "Camera/CameraComponent.h" //Camera组件class 工程名称_API AMyPawn : public APawn { //定义组件变量 public:UPROPERTY(VisibleAnywhere, BlueprintRead…

Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组

两数之和 —— 无序数组 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

跟着pink老师前端入门教程-day21

5.4 常见flex布局思路 5.5 背景线性渐变 语法&#xff1a; background: linear-gradient( 起始方向 , 颜色 1, 颜色 2, ...); background: -webkit-linear-gradient(left, red , blue); background: -webkit-linear-gradient(left top, red , blue); 背景渐变必须添加浏览…

【C++】基础知识讲解(引用、内联、auto,基于范围for循环)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 引用 概念 特性 使用场景 作参数 作返回值 传值、传引用效率比较 引用和指针的区别 内联函数 概念…

用python编写爬虫,爬取二手车信息+实验报告

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88805518使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件&#xff0c;再run all就行 注意事项 可能遇到的bug 暂无&#xff0c;有的话私信我

Unity类银河恶魔城学习记录4-1,4-2 Attack Logic,Collider‘s collision excepetion源代码 P54 p55

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; u…

(十五)springboot实战——spring securtity的核心过滤器介绍

前言 本节内容主要介绍spring securtity安全框架的一些核心过滤器及其作用&#xff0c;我们都清楚spring securtity安全框架底层是基于filter过滤器实现的&#xff0c;采用的是责任链的设计模式&#xff0c;它有一条很长的过滤器链。本次spring securtity原理介绍使用的版本是…

MySQL之建表操作

华子目录 表操作创建表数据类型文本类型数值类型日期/时间类型Bit数据类型常见数据类型 MySQL存储引擎创建表的三个操作创建表时指定存储引擎&#xff0c;字符集&#xff0c;校对规则&#xff0c;行格式 查看表显示数据库中所有表显示数据库中表的信息&#xff08;表结构&#…

航芯ACM32G103开发板评测 06 1.28圆形屏幕 LVGL移植

航芯ACM32G103开发板评测 06 1.28圆形屏幕 LVGL移植 软硬件平台 航芯ACM32G103开发板1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口 GC9A01驱动芯片LVGL V8.3.1源码 LVGL LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是一个免费的开源图形库&…

类与对象(终章)——友元,内部类,匿名对象

这里写目录标题 1. 友元1.2 友元函数1.3 友元类 2. 内部类3.匿名对象 1. 友元 之前实现日期类我们实现输入输出流重载的时候就已经了解了友元的概念&#xff0c;我们今天正式走进友元&#xff0c;详细地学习友元的各种特点与性质。 关键字:friend 1.2 友元函数 友元函数在重载…

基于Java学生管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

Springboot简单设计两级缓存

两级缓存相比单纯使用远程缓存&#xff0c;具有什么优势呢&#xff1f; 本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远…