【C++修炼之路】类与对象实战:实现一个日期类

【C++修炼之路】类与对象实战:实现一个日期类
Alt

🏝️专栏: 【C++修炼之路】
🌅主页: f狐o狸x

“于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡” 


目录

一、日期类的核心功能

 二、日期类的定义

三、实现日期类比较大小

四、日期类加减

五、输入输出日期

六、附带功能


        经过前面两篇文章的学习,相信聪明的你应该已经初步了解类与对象了,现在我们将一起实现一个日期类,进一步加深我面对类的理解。

        在软件开发中,日期和时间的处理无处不在,从日程管理到金融计算,从数据分析到天气预报,日期类的设计都是开发者必须面对的挑战。在本文中,我们将从零开始,一步步实现一个功能完备的日期类。无论你是C++新手,还是想巩固面向对象编程基础,这个项目都会让你收获满满。

一、日期类的核心功能

        想象一下:如果你要实现你手机里的日历这个app,它应该有些什么功能呢?

        我认为主要功能如下:

 日期合法性校验 日期加减(支持天数、月数、年数) 日期差计算 重载运算符(+-==<< 等)星期的计算与格式化输出

 二、日期类的定义

        要想实现上面的功能,我们需要三个内部成员来表示日期(年、月、日),在通过各种函数来实现各种功能

class Date { //友元声明 friend ostream& operator<<(ostream& _cout, const Date& d); friend istream& operator>>(istream& _cin, Date& d); public: //构造函数 Date(int year = 1, int month = 1, int day = 1); //拷贝构造函数 Date(Date& d) { _year = d._year; _month = d._month; _day = d._day; } //打印日历 void PrintCalendar() { cout << _year << "-" << _month << "-" << _day << endl; } //操作符重载 bool operator<(const Date& x) const; bool operator==(const Date& x) const; bool operator<=(const Date& x) const; bool operator>(const Date& x) const; bool operator>=(const Date& x) const; bool operator!=(const Date& x) const; // 获取某年某月的天数 int GetMonthDay(int year, int month); Date& operator+=(int days); Date operator+(int days); Date& operator-=(int days); Date operator-(int days); Date& operator++(); Date operator++(int); Date& operator--(); Date operator--(int); // 日期类成员 private: int _year; // 年 int _month; // 月 int _day; // 日 };

三、实现日期类比较大小

        比较两天日期的大小我们用重载函数  bool operate<(const class& Date) const 和 bool operator==(const Date& x) const两个重载函数完成,剩下的可以用这两个表示

bool Date::operator<(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 return false; } bool Date::operator==(Date& d) { if (_year == d._year && _month == d._month && _day == d._day) return true; else return false; } bool Date::operator<=(Date& d) { return (*this) < d || (*this) == d; } bool Date::operator>(Date& d) { return !(*this <= d); } bool Date::operator>=(Date& d) { return !(*this < d); } bool Date::operator!=(Date& d) { return !(*this == d); }

四、日期类加减

        想完成日期类的加减,其实就是把日期里的天数都合法化,大于这个月的天数,就加一个月,日期小于等于0,就减少一个月,当月份加到13的时候,就重置为1,年份加1,同理,当月份减少到0的时候,就置为12,年份减1。这里我们还需要写一个函数来获取这个月的天数有多少天(主要是判断是否为闰年闰月,如果是就返回29天,其他就正常返回)

int Date::GetMonthDay(int year, int month) { int days[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 days[month]; } Date& Date::operator+=(int days) { _day += days; while (_day > GetMonthDay(_year, _month)) { _day -= GetMonthDay(_year, _month); _month++; if (_month == 12) { _year++; _month = 1; } } return *this; } Date Date::operator+(int days) const { Date tmp = (*this); tmp += days; return tmp; } Date& Date::operator-=(int days) { _day -= days; while (_day <= 0) { _day += GetMonthDay(_year, _month); _month--; if (_month == 0) { _month = 12; _year--; } } return *this; } Date Date::operator-(int days) const { Date tmp = *this; tmp -= days; return tmp; } Date& Date::operator++() { *this += 1; return *this; } Date Date::operator++(int) const { Date tmp = *this; tmp += 1; return tmp; } Date& Date::operator--() { *this -= 1; return *this; } Date Date::operator--(int) const { Date tmp = *this; tmp -= 1; return tmp; } int Date::operator-(const Date d) const { Date max = *this, min = d; int flag = 1; if (max < min) { flag = -1; max = d; min = *this; } int n = 0; while (max != min) { ++min; ++n; } return n * flag; }

五、输入输出日期

        这里需要用到友元函数,才能将按我们的习惯把日出输出出来

ostream& operator<<(ostream& _cout, const Date& d) { _cout << d._year << "-" << d._month << "-" << d._day ; return _cout; } istream& operator>>(istream& _cin, Date& d) { _cin >> d._year >> d._month >> d._day; return _cin; }

六、附带功能

        完成这些之后,我们可以通过库函数<ctime>去获得当天的日期,然后做一份倒计时出来

void TestCalendar1() { Date d1,d2; d1.GetTodayData(); cout << "今天是:" << d1 << endl; cout << "请输入蓝桥杯日期:" ; cin >> d2; cout << "距离蓝桥杯还有" << (d2 - d1) << "天,加油吧骚年" << endl; } int main() { TestCalendar1(); return 0; } 

         这里就是日期类的全部实现内容啦,如果你也自己实现一遍,你对类和对象的理解将会上升一个层次,加油学习吧!

Read more

Java 中间件:Kafka 分区策略(自定义分区器实现负载均衡)

Java 中间件:Kafka 分区策略(自定义分区器实现负载均衡)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java中间件这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 中间件:Kafka 分区策略(自定义分区器实现负载均衡) 🚀 * 1. Kafka 分区机制基础 🧱 * 1.1 什么是分区? * 1.2 默认分区策略 * 2. 为什么需要自定义分区器?🎯 * 场景一:避免热点分区 🔥 * 场景二:按业务维度分片 🗂️ * 场景三:动态负载感知 📊 * 3. Kafka 分区器接口详解 🛠️ * 核心方法说明: * 4. 实战:实现一个简单的自定义分区器 💻 * 4.1 项目依赖 * 4.2 自定义分区器代码 * 4.3 配置生产者使用自定义分区器

By Ne0inhk
从兼容到超越:KingbaseES 突破 MySQL 权限局限,以权限隔离筑牢数据安全防线

从兼容到超越:KingbaseES 突破 MySQL 权限局限,以权限隔离筑牢数据安全防线

前言 对于数据库安全而言,用户权限隔离是守护数据访问边界、杜绝未授权操作的核心能力。KingbaseES 作为面向企业的专业数据库产品,一方面通过兼容 MySQL 核心语法简化迁移流程,另一方面突破基础兼容局限,完成了向“功能增强”阶段的升级。依靠用户权限隔离功能为普通用户提供表、函数、视图、字段等数据库对象的精细化访问管控,以权限隔离筑牢数据安全防线。 文章目录 * 前言 * 一、用户权限隔离核心概述 * 1.1 功能定位与价值 * 1.2 核心语法:启用与禁用 * 二、功能实现原理 * 2.1 底层依赖:行级安全策略(RLS) * 2.2 关键技术组件 * 2.2.1核 心结构体与列表 * 2.2.2 权限判断函数 * 三、用户权限隔离实战操作 * 3.

By Ne0inhk
离线部署指南:本地下载MySQL 8.0.37并上传服务器Centos7.9安装

离线部署指南:本地下载MySQL 8.0.37并上传服务器Centos7.9安装

离线部署指南:本地下载MySQL 8.0.37并上传服务器安装 在生产环境中,我们常常会遇到服务器无法连接外网的情况,这时候就需要离线安装MySQL。本文详细介绍如何从官网下载MySQL 8.0.37,上传到CentOS 7.9服务器并进行完整安装配置。 环境准备 * 操作系统: CentOS 7.9 * MySQL版本: 8.0.37 * 安装方式: RPM包离线安装 第一步:下载MySQL安装包 访问MySQL官网 1. 打开 MySQL Community Server下载页面 2. 选择版本信息: * Operating System: Linux - Generic * OS Version: Linux - Generic (glibc 2.12) 下载类型:

By Ne0inhk
Spring Cloud之服务入口Gateway之自定义过滤器

Spring Cloud之服务入口Gateway之自定义过滤器

目录 过滤器执行顺序 自定义过滤器 自定义GatewayFilter 定义GatewayFilter 配置过滤器 启动服务并访问 自定义GlobalFilter 定义GlobalFilter 启动服务并访问 服务部署 过滤器执行顺序 如果⼀个项⽬中, 既有GatewayFilter, ⼜有 GlobalFilter时, 执⾏的先后顺序是什么呢? 请求路由后, ⽹关会把当前项⽬中的GatewayFilter和GlobalFilter合并到⼀个过滤器链(集合)中, 并进⾏排序, 依次执⾏过滤器. 每⼀个过滤器都必须指定⼀个int类型的order值, 默认值为0, 表⽰该过滤的优先级. order值越⼩,优先级越⾼,执⾏顺序越靠前. • Filter通过实现Order接⼝或者添加@Order注解来指定order值. • Spring Cloud Gateway提供的Filter由Spring指定. ⽤⼾也可以⾃定义Filter, 由⽤⼾指定.

By Ne0inhk