三、一个规范的日期类

hive开发规范 一、 建表规范: Hiive分为内部表和外部表,一般情况,只允许建外部表,不建议使用内部表。 LZO标准建表模板如下所示: create EXTERNAL table app_sku_pur_attrib ( stat_dt string comment ‘统计日期’ , ord_item_units double comment ‘下单商品件数’, valid_ord_qtty ... 阅读详情

之前的学习中我们经常以日期类Date作为例子帮助我们理解,但实际上我们之前实现的类是不规范的。一个规范的类,应该是声明和定义分开的,在有了前边知识的基础后,下面我们来实现一个规范的日期类Date。

下面的代码实际上在之前的例子中都是出现过的,所以具体实现过程不再过多赘述。

21.1 结构设计

Date.h:函数和类的声明
Date.cpp:函数的实现
Test.cpp:测试类

21.2 完整代码

21.2.1 Date.h
#include <iostream>
#include <assert.h>
using namespace std;
class Date
{
    friend ostream& operator<<(ostream& out, const Date& d);
    friend istream& operator>>(istream& in, Date& d);
public:
    explicit Date(int year = 1900, int month = 1, int day = 1);//一般规定在声明的地方给出缺省参数
    int GetMonthDay(int year, int month) const;
    Date& operator+=(int day);
    Date operator+(int day) const;
    Date& operator-=(int day);
    Date operator-(int day) const;
    Date& operator++();//前置++
    Date operator++(int);//后置++
    Date& operator--();//前置--
    Date operator--(int);//后置--
    int operator-(const Date& d);
    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;
    void Print();
    
private:
    int _year;
    int _month;
    int _day;
};
ostream& operator<<(ostream& out, const Date& d);
istream& operator>>(istream& in, Date& d);
21.2.2 Date.cpp
#include "Date.h"
int Date::GetMonthDay(int year, int month) const
{
    int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    assert(month > 0 && month < 13);
    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
    {
        return 29;
    }
    else
    {
        return monthArray[month];
    }
}
Date::Date(int year, int month, int day)
{
    //检查日期是否合法
    if (month > 0 && month < 13
        && (day > 0 && day <= GetMonthDay(year, month)))
    {
        _year = year;
        _month = month;
        _day = day;
    }
    else
    {
        cout << "日期非法" << endl;
    }
}
Date& Date::operator+=(int day)
{
    if (day < 0)
    {
        *this -= (-day);
        return *this;
    }
    _day += day;
    if (_day < 0)
    {

    }
    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _year++;
            _month = 1;
        }
    }
    return *this;
}
Date Date::operator+(int day) const
{
    Date tmp = *this;
    /*tmp._day += day;
    while (tmp._day > GetMonthDay(tmp._year, tmp._month))
    {
        tmp._day -= GetMonthDay(tmp._year, tmp._month);
        tmp._month++;
        if (tmp._month == 13)
        {
            tmp._year++;
            tmp._month = 1;
        }
    }*/
    tmp += day;//复用operator+=
    return tmp;
}
Date& Date::operator++()
{
    *this += 1;
    return *this;
}
Date Date::operator++(int)
{
    Date tmp(*this);
    *this += 1;
    return tmp;
}
Date& Date::operator-=(int day)
{
    if (day < 0)
    {
        *this += (-day);
        return *this;
    }
    _day -= day;
    while (_day <= 0)
    {
        _month--;
        if (_month == 0)
        {
            _year--;
            _month = 12;
        }
        _day += GetMonthDay(_year, _month);
    }
    return *this;

}
Date Date::operator-(int day) const
{
    Date tmp = *this;
    tmp -= day;
    return tmp;
}
Date& Date::operator--()
{
    *this -= 1;
    return *this;
}
Date Date::operator--(int)
{
    Date tmp(*this);
    *this -= 1;
    return tmp;
}   
int Date::operator-(const Date& d)
{
    Date max = *this;
    Date min = d;
    int flag = 1;
    int n = 0;
    if (*this < d)
    {
        max = d;
        min = *this;
        flag = -1;
    }
    while (min != max)
    {
        min++;
        n++;
    }
    return n;
}
bool Date::operator==(const Date& d) const
{
    return _year == d._year
        && _month == d._month
        && _day == d._day;
}
bool Date::operator<(const Date& d) const
{
    return _year < d._year
        || (_year == d._year && _month < d._month)
        || (_year == d._year && _month == d._month && _day < d._day);
}
bool Date::operator<=(const Date& d) const
{
    return *this < d || *this == d;
}
bool Date::operator>(const Date& d) const
{
    return !(*this <= d);
}
bool Date::operator>=(const Date& d) const
{
    return !(*this < d);
}
bool Date::operator!=(const Date& d) const
{
    return !(*this == d);
}
ostream& operator<<(ostream& out, const Date& d)
{
    out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
    return out;
}
istream& operator>>(istream& in, Date& d)
{
    in >> d._year >> d._month >> d._day;
    return in;
}
void Date::Print()
{
    cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
21.2.3 Test.cpp
#include "Date.h"
void TestDate1()//测试operator<<
{
	cout << "TestDate1:测试<<" << endl;
	Date d1(2023, 10, 5);
	cout << d1;
}
void TestDate2()//测试>>
{
	cout << "TestDate2:测试>>" << endl;
	Date d1;
	cin >> d1;
	cout << d1;
}
void TestDate3()//测试+=、+、前置++、后置++
{
	cout << "TestDate3.1:测试+=" << endl;
	Date d1(2023, 1, 1);
	cout << d1;
	d1 += 30;
	cout << "加上30天后为:" << d1;
	cout << "TestDate3.2:测试+" << endl;
	Date d2(2023, 1, 1);
	cout << d2;
	d2 = d1 + 30;
	cout << "d1加上30天后为:" << d1;
	cout << "TestDate3.3:测试前置++" << endl;
	Date d3(2023, 1, 1);
	cout << d3;
	cout << ++d3;
	cout << ++d3;
	cout << "TestDate3.4:测试后置++" << endl;
	Date d4(2023, 1, 1);
	cout << d4;
	cout << d4++;
	cout << d4++;
}
void TestDate4()//测试-=、日期-天数、前置--、后置--、日期相-
{
	cout << "TestDate4.1:测试-=" << endl;
	Date d1(2023, 1, 1);
	cout << d1;
	d1 -= 1;
	cout << "减上1天后为:" << d1;
	cout << "TestDate4.2:日期减天数" << endl;
	Date d2(2023, 1, 1);
	cout << d2;
	d2 = d2 - 1;
	cout << "d1减1天后为:" << d1;
	cout << "TestDate4.3:测试前置--" << endl;
	Date d3(2023, 1, 1);
	cout << d3;
	cout << --d3;
	cout << --d3;
	cout << "TestDate4.4:测试后置--" << endl;
	Date d4(2023, 1, 1);
	cout << d4;
	cout << d4--;
	cout << d4--;
	cout << "TestDate4.5:测试日期相减" << endl;
	Date d5(2023, 1, 1);
	Date d6(2023, 10, 1);
	int ret = d6 - d5;
	cout << d5;
	cout << d6;
	cout << "两个日期相差" << ret << "天";
}
void TestDate5()//测试==、<、<=、>、>=、!=
{
	cout << "TestDate5.1:测试==" << endl;
	Date d1;
	Date d2;
	cout << "d1:" << d1;
	cout << "d2:" << d2;
	if (d1 == d2)
	{
		cout << "d1 == d2" << endl;
	}
	cout << "TestDate5.2:测试<" << endl;
	Date d3(2023, 1, 1);
	Date d4(2023, 1, 2);
	cout << "d3:" << d3;
	cout << "d4:" << d4;
	if (d3 < d4)
	{
		cout << "d3 < d4" << endl;
	}
	cout << "TestDate5.3:测试<=" << endl;
	Date d5(2023, 1, 1);
	Date d6(2023, 1, 1); 
	Date d7(2022, 12, 31);
	cout << "d5:" << d5;
	cout << "d6:" << d6;
	cout << "d7:" << d7;
	if (d5 <= d6)
	{
		cout << "d5 <= d6" << endl;
	}
	if (d7 <= d6)
	{
		cout << "d7 <= d6" << endl;
	}
	cout << "TestDate5.4:测试>" << endl;
	Date d8(2023, 1, 1);
	Date d9(2023, 1, 2);
	cout << "d8:" << d8;
	cout << "d9:" << d9;
	if (d9 > d8)
	{
		cout << "d9 > d8" << endl;
	}
	cout << "TestDate5.5:测试>=" << endl;
	Date d10(2023, 1, 1);
	Date d11(2023, 1, 1);
	Date d12(2022, 12, 31);
	cout << "d10:" << d10;
	cout << "d11:" << d11;
	cout << "d12:" << d12;
	if (d11 >= d10)
	{
		cout << "d11 >= d10" << endl;
	}
	if (d11 >= d12)
	{
		cout << "d11 >= d12" << endl;
	}
	cout << "TestDate5.6:测试!=" << endl;
	Date d13(2023, 1, 1);
	Date d14(2023, 1, 2);
	cout << "d13:" << d13;
	cout << "d14:" << d14;
	if (d13 != d14)
	{
		cout << "d13 != d14" << endl;
	}
}
int main()
{
	TestDate5();
	return 0;
}
⚡【C++要笑着学】(9) 类和对象练习:日期类的实现 | 从零设计日期类各个接口 | 感受代码复用的便捷性 | 体会测试代码的重要性 | 提供完整代码 上一章我们讲解了运算符重载,本篇将手把手从零开始一步步实现一个Date类,将会对每个步骤进行详细的思考和解读。 阅读详情

相关推荐

一文详解Stata重复测量方差分析的概念、原理、适用情形以及操作命令实现、对结果的解读、操作注意事项 附零基础小白友好入门Stata统计学/计量经济学学习路径

重复测量方差分析(Repeated Measures ANOVA)适用于同一受试者在不同时间点或条件下的多次测量数据,如疗效跟踪和跨条件对比研究。其核心特征包括:数据结构为每个受试者多个观测值,数据具有相关性(违反独立性假设),变异分解为个体间和个体内变异。关键假设包括正态性、方差齐性和球形性(通过Mauchly检验验证)。适用场景包括纵向研究和小样本追踪,但不适用于存在滞留效应或学习效应显著的数据。操作步骤涉及数据准备(宽/长格式转换)、正态性与球形性检验、主分析命令(单/多因素)及事后检验。

m0_72274883的博客 1564

C++类和对象实战——日期类的实现

经过类和对象三节内容的深入学习,为了更好的理解所学的知识,那我们就要运用所学的知识去实现日期类,完成一个简单的日期计算器所具备的功能。那么,我们现在开始吧~class Datepublic:private:int _year;int _month;int _day;定义了三个私有的成员变量为_year,_month,_day分别代表年,月,日;这里变量名添加下划线是为了后续便于区分。

weixin_58728045的博客 1222

基于FFmpeg与Nginx的大华摄像头实时视频Web接入方案

本文详细介绍了一种基于FFmpeg与Nginx的大华摄像头实时视频Web接入方案。该方案通过FFmpeg将摄像头RTSP协议流转换为浏览器友好的HLS格式,并利用Nginx进行高效分发,最终结合Video.js构建前端播放页面,实现无需插件的跨平台实时监控。方案具有免费、轻量、稳定、易于部署的特点,适合中小企业、个人开发者快速搭建内部监控或展示系统。

weixin_28040125的博客 343

【类与对象实例练习:实现一个日期类】

通过实现一个完成的日期类来加深对类与对象的深入理解与使用

weixin_56235740的博客 406

PowerBI参数化实战:3分钟搞定动态数据源切换(附常见错误排查)

本文详细介绍了PowerBI参数化实战技巧,教你3分钟实现动态数据源切换。通过创建参数、改造查询和测试切换三步,轻松应对多环境部署与团队协作中的路径问题,并附上常见错误排查指南,有效提升报表的可维护性和工作效率。

p1q2r的博客 585

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧)

本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。

h6i7j8的博客 1173

C++设计一:日期类Date实现

本文设计并实现了一个基于C++的日期类Date,支持日期的基本操作与运算。

shuibuxingaaa的博客 2567

高分思路!挑战7天完成一篇网状meta DAY1-7

PASSION!继续析挑战,7天完成一篇网状meta分!

MR_SCI_help的博客 783

日期类 - Java

日期类 - Java

yavlgloss的博客 1034

GenomeSurvyIndex设计--随笔017

摘要: GenomeSurvyIndex是一款自动化多倍体基因组调查工具,整合FastK、Smudgeplot和GenomeScope2.0三大核心组件。该工具通过k-mer频谱特征自动识别基因组倍性类型,包括二倍体(1:2:4)和同源四倍体(1:2:3:4),并采用3a1b>2a2b算法判定同源/异源多倍体。工具提供完整的conda环境配置方案,封装为Python脚本实现全流程自动化分析,包含k-mer计数、倍性判定、基因组特征计算等功能,最终输出标准化报告和可视化图表。该方案可直接部署使用,适用于

weixin_44874487的博客 473

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用 来源:https://buuoj.cn/ 内容: 附件:https://pan.baidu.com/s/1FKkXN6JDI0QkGw-UE2crNA?pwd=grb0 提取码:grb0 答案:Y0u_hav3_r3v3rs3_1t! 总体思路 发现是虚机模拟 形成每个指令的逆向 找到加密值位置(有可能不止一个位置,该题就给了一个误导的) 找到命令执行的流程(也是不止一个) 逆向编写反向加密得到f

serfend's blog 976

第十三章 常用类 日期类

Date日期类

你好, 我在学java的博客 4768

【YOLO目标检测全栈实战】98 YOLO模型在低光照环境下的自适应增强策略

你有没有遇到过这种情况?深夜加班调试产线检测模型,车间灯光昏暗,摄像头采集的图片黑乎乎一片,YOLO模型直接“罢工”——漏检率飙升到40%以上。上个月我在一个汽车零部件质检项目里就栽了跟头:白天模型跑得飞起,mAP@0.5达到0.92,可一到夜班,同样的产线、同样的零件,mAP直接掉到0.63。客户拍着桌子问我:“你这模型怎么还分白天黑夜?”

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 284

JAVA日期类

日期类 第一代日期类 1.Date类:精确到毫秒,代表特定的瞬间 2.SimpleDateFormat类:格式和解析日期的类 SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化【日期 --> 文本】,解析【文本 --> 日期】和规范化 3.SimpleDateFormat类需要掌握方法【format:格式形式 parse:转换解析【就是将字符串日期格式转成Date类】】 4.一般情况下Date类和SimpleDateFormat类一起搭配使用 Date和

weixin_47267628的博客 6164

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++实现日期类

0x00 引入为了能够更好地讲解运算符重载的知识,我们将手把手地、一步一步地实现 "日期类" ,因为通过日期类去讲解运算符重载是比较合适的。日期类的拷贝构造、赋值、析构我们都可以不用写,让编译器自己生成就行了。0x00 设计构造函数规范一点,我们声明与定义分离开来。💬 Date.hpublic:// 全缺省构造// 打印函数private:int _year;int _month;int _day;};💬 Date.cpp。

chengxuyuanlaow的博客 564

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

手撕日期类的实现【C++版】

接上篇我们学习了C++ 的六个默认成员函数以后,本节内容小编将带大家手撕完整的一个日期类的实现,从而来加深大家对上节内容(6个默认成员函数)的认识。那么话不多说,我们直接开干。

2302_79341182的博客 1020

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【手撕代码】日期类的实现

在本章中,我们将运用之前学到的C++知识来构建一个日期类。通过这个实践项目,不仅能加深对类和对象的理解,还能提升编程实践能力。下面让我们开始具体实现吧!以后的手撕代码环节我们都将采用声明与定义分离的代码编写方式。这是为了实现接口与逻辑的解耦,同时避免重复编译、隐藏实现细节,以适配多人协作和大型项目开发。

2401_84396802的博客 1169

【C++之类和对象】日期类的实现

在我们的日常生活中都需要知道当天的日期,同时也可能需要知道几天后的日期,几天前的日期,还有就是距离我们想要的日期还剩几天,比如:距离高考还有几天这样的信息,所以日期类对于我们任何人来说都是一个非常重要的工具。今天这篇文章将详细介绍日期类中各种功能的实现以及细节

胡坚涛的博客 1054

【C++】日期类的实现

本文介绍了C++日期类的实现,主要包括构造函数、打印函数和各类运算符重载。构造函数通过GetMonthDay函数验证日期合法性;打印函数显示日期信息;详细讲解了+=、-=、+、-等运算符的实现逻辑,强调复用原则和返回值处理;比较运算符通过复用>和==实现其他关系运算。日期类实现中重点关注了闰年处理、日期合法性调整以及前/后置++/--运算符的区别,体现了C++面向对象的思想和运算符重载的实用技巧。

qq_2778465975的博客 1108

《日期类》

第一代日期类 1) Date : 精确到毫秒,代表确定的瞬间 2)SimpleDateFormat: 格式和解析日期的类 。SimpleDateFormat 格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 - > 日期) 和规范化 第二代日期类 第二代日期类,主要就是 Calendar类(日历)。Calendar是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH 、 HOUR 等日历字段之间的转换提供了一些方法,并为操作日

m0_64318566的博客 833

Java 中的日期类

Java 中日期类的演变从最初的,到稍后的,再到现代化的 java.timeAPI,是对日期处理方式的不断优化和提升。新日期 API(即 Java 8 引入的 java.time 包)克服了旧 API 的设计缺陷,提供了更简洁、安全和强大的日期时间处理工具。在开发中,建议使用 java.time 包,以享受其带来的便利性和安全性。

小萌学习笔记 1084

[Java基础揉碎]日期类

2) Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、 MONTH、DAY_OF_MONTH、HOUR等 日历字段 之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。2) SimpleDateFormat: 格式和解析日期的类 SimpleDateFormat 格式化和解析日期的具体类。1) LocalDate(日期)、 LocalTime(时间)、 LocalDateTime(日期时间)JI。1)第二代日期类,主要就是Calendar类(日历)。

YJH000_的博客 437

第二章:类——日期类的实现

cpp日期类的实现,包括函数的实现和详细的分析讲解。 私有成员,成员函数,运算符重载,输入输出重载。

weixin_63716012的博客 825

26 详解java的日期类

1 🚩第一代日期类,Date类 1.1 🏃🏻Date的使用步骤 1.2 🌰代码示例: 2 🚩第二代日期类Calendar类 2.1 🏃🏻简介: 2.2 🌰使用代码示例: 3 🚩第三代日期类(JDK8加进的) 3.1 🌰LocalDateTime类& 使用示例 3.2 🏃🏻时间戳Instant 3.3 🌰代码示例 3.4 🏃🏻第三代日期类提供了plus方法和minus方法可以对时间进行加减 3.5 🌰代码示例............

Zinksl的博客 1073

mysql的日期类

7.5、insert插入日期 数字格式化:format select ename,sal from emp; 格式化数字:format(数字, '格式') select ename,format(sal, '$999,999') as sal from emp; str_to_date:将字符串varchar类型转换成date类型 date_format:将date类型转换成具有一定格式的varchar字符串类型。 ...

qq_37753562的博客 853

ClickHouse开发规范

文章目录一、建表规范1.1 数据表引擎选择Log系列Integration系列Special系列MergeTree系列1.2 数据表字段选择数值类型字符串类型日期类型二、SQL规范 一、建表规范 数据表必须设置主键 数据表必须有以下字段 created_date updated_date created_by updated_by 1.1 数据表引擎选择 Log系列 Log系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景。 几种Log表引擎的共性是: 数据被顺序ap

雪辉博客 2423
上一篇: 二、类与对象(三)
下一篇: 二、类与对象(四)
Kutbas
博客等级 码龄7年 737粉丝 55原创
评论 54
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kutbas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值