通过Date类学习面向对象

news2024/11/18 17:30:24

通过手撸这个类的实现,我们可以学习到构造、析构、运算符重载,拷贝构造等面向对象中重要的知识。

首先先看头文件中类的定义:

class Date
{
public:
    // 获取某年某月的天数
    int GetMonthDay(int year, int month);
    // 全缺省的构造函数
    Date(int year = 1900, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    // 拷贝构造函数
  // d2(d1)
    //Date(const Date& d);可使用默认生成的拷贝构造
    // 赋值运算符重载
  // d2 = d3 -> d2.operator=(&d2, d3)
    //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);
    // ==运算符重载
    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);
    // 日期-日期 返回天数
    int operator-(const Date& d);
private:
    int _year;
    int _month;
    int _day;
};

再来看这个类在源文件中的实现:

#include<stdlib.h>
#include<stdio.h>
#include"iostream"
#include"tt.h"
using namespace std;
​
//对于关系运算符的重载,如下,只需要写一个<=和==,其他就可以运用互补或相反的逻辑写出
bool Date::operator <= (const Date& d)
{
    if (_year > d._year)
        return false;
    else if (_year == d._year && _month > d._month)
        return false;
    else if (_year == d._year && _month == d._month && _day > d._day)
        return false;
    else
        return true;
}
​
bool Date::operator>(const Date& d)
{
    return !(*this <= d);
}
​
bool Date::operator==(const Date& d)
{
    return _year == d._year
        && _month == d._month
        && _day == d._day;
}
​
bool Date::operator!=(const Date& d)
{
    return !(*this == d);
}
​
bool Date::operator<(const Date& d)
{
    return !(*this == d) && (*this <= d);
}
​
bool Date::operator>=(const Date& d)
{
    return (*this > d) || (*this == d);
}
​
​
​
// 获取某年某月的天数
int Date::GetMonthDay(int year, int month)
{
    static int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    if (month != 2)
    {
        return days[month];
    }
    else
    {
        //判断是否为闰年
        if (year % 4 == 0 && year % 100 != 0 && year % 400 == 0)
            return 29;
        else
            return 28;
    }
}
​
Date& Date::operator+=(int day)
{
    _day += day;
    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _month = 1;
            _year++;
        }
    }
    return *this;
}
​
Date Date::operator+(int day)
{
    Date tmp(*this);
    tmp += day;
    return tmp;
}
​
Date& Date::operator-=(int day)
{
    while (_day <= day)
    {
        day -= _day;
        _month--;
        if (_month == 0)
        {
            _month = 12;
            _year--;
        }
        _day = GetMonthDay(_year, _month);
    }
    if (day != 0)
    {
        _day -= day;
    }
    return *this;
}
​
Date Date::operator-(int day)
{
    Date tmp(*this);
    tmp -= day;
    return tmp;
}
​
// 前置++
Date& Date::operator++()
{
    *this += 1;
    return *this;
}
​
// 后置++,规定后置++参数列表有一个int占位,和前置++构成重载
Date Date::operator++(int)
{
    Date tmp(*this);
    *this += 1;
    return tmp;
}
​
// 后置--
Date Date::operator--(int)
{
    Date tmp(*this);
    *this -= 1;
    return tmp;
}
​
// 前置--
Date& Date::operator--()
{
    *this -= 1;
    return *this;
}
​
// 日期-日期 返回天数
int Date::operator-(const Date& d)
{
    int cnt = 0;
    Date small(*this), big(d);
    if (small > big)
    {
        small = d;
        big = *this;
    }
    //年份相同、月份相同时结束循环(结束的条件取反即为继续的条件)
    while (small._year != big._year || small._month  != big._month)
    {
        cnt += GetMonthDay(small._year, small._month);
        small += GetMonthDay(small._year, small._month);
    }
    while (small != big)
    {
        if (small > big)
        {
            --small;
            cnt--;
        }
        else
        {
            ++small;
            ++cnt;
        }
    }
​
    if (*this < d)
    {
        cnt = cnt * (-1);
    }
    
    return cnt;
}

通过以上练习可以总结出如下知识:

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

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

相关文章

算法的时间复杂度和空间复杂度(友友们专属限定版)

&#x1f349;博客主页&#xff1a;阿博历练记 &#x1f4d6;文章专栏&#xff1a;数据结构与算法 &#x1f69a;代码仓库&#xff1a;阿博编程日记 &#x1f339;欢迎关注&#xff1a;欢迎友友们点赞收藏关注哦 文章目录 &#x1f3a8;1.算法的复杂度介绍&#x1f3a8;2.时间复…

坤强服务器安装

记录一下服务器安装做raid和安装系统 raid 0 拆分开分别存在3块硬盘,一块坏了,全部不能用了, 但是存储速度最快 raid 1 具有最高的安全性,备份一份,容量只有总容量的一半 raid 10 先组两个raid1,再组两个raid0 .有raid 1的安全性和50%的使用容量 raid 5 安全性&#xff…

汇编二、51单片机内部结构

1、单片机内部资源 以AT89C51单片机为例&#xff0c;参考数据手册。 Atmel官网&#xff1a; https://www.microchip.com/ (1)1个8位CPU。 (2)4K ROM&#xff0c;128字节RAM。 (3)32个GPIO&#xff1b;定时器(Timer)&#xff1b;串口(UART)&#xff1b;中断系统(Interrupt…

Qt之滑动条和进度条(QSlider、QProgressBar)

文章目录 前言一、QSliderQSlider的常用API信号与槽 二、QProgressBar滑动条和滚动条的常用API 总结 前言 在用户界面设计中&#xff0c;滑动条和进度条是常见的控件。Qt中提供了QProgressBar和QSlider两个类来实现滚动条和滑动条。 一、QSlider 在Qt中&#xff0c;QSlider是…

ChatGPT攥写广告文案-写好广告营销软文的必备要点

chatgpt帮助我们写营销软文 Chat GPT是一款强大的自然语言处理模型&#xff0c;可以辅助您编写优秀的营销软文。下面是几个使用 Chat GPT 更好的编写营销软文的建议&#xff1a; 利用Chat GPT自动摘要 Chat GPT能够将一段较长的营销文本精简成几个关键点&#xff0c;这有利于…

32. 最长有效括号

32. 最长有效括号 难度困难2251 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "…

《C语言技术体系》 学习路线总目录 + 思维导图

目录 前言 正文 思维导图 第1章 流程结构 1.1 初识C语言 1.2 流程结构 1.3 数据类型 1.4 运算符表达式 第2章 指针与数组 2.1 指针基本概念 2.2 一维数组 2.3 二维及多维数组 2.4 指针与数组 第3章 模块化重构 3.1 函数 3.2 typedef类型定义 3.3 enum枚举 3.…

手把手教你使用vue2搭建微前端micro-app

​ 简述 本文主要讲述新手小白怎么搭建micro-app&#xff0c;几乎是每一步都有截图说明。上手应该很简单。 本来我之前已经写了一篇手把手教程了&#xff0c;但是当时写的结个太乱了&#xff0c;趁着五一休假&#xff0c;重新整理了一番&#xff0c;加了文章目录&#xff0c;…

如何显示文件夹的后缀和隐藏文件

© Ptw-cwl 文章目录 前言文件夹后缀隐藏文件 如何设置显示文件夹的后缀和隐藏文件 前言 文件夹后缀 文件后缀是指文件名中最后一个“.”后面的一串字符&#xff0c;用来表示该文件的类型或格式。不同的文件类型有不同的后缀&#xff0c;例如&#xff0c;常见的图片文件…

对象浅拷贝的5种方式

参考原文:浅拷贝的五种实现方式 - 掘金 (juejin.cn) 哈喽 大家好啊 最近发现自己对对象都不是很熟练&#xff0c;特别是涉及到一些复制&#xff0c;深浅拷贝的东西 1.Object.assign 首先 我们创建一个空对象obj1 然后创建一个对象obj2 用object.assign(目标对象&#xff0c…

庖丁解牛函数知识---C语言《2》

目录 前言&#xff1a; 1.嵌套调用函数 2.链式访问 3.函数的声明与定义 4.*递归 5.递归与非递归 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础&#xff0c;C生万物&#xff01; 开始我们的C语言之旅吧…

C6678学习-GPIO

文章目录 1、简介2、框图3、寄存器4、地址 1、简介 C6678中共有16个GPIO&#xff0c;GPIO0~GPIO15。这些引脚的功能如下 ​ 通用输入输出管脚​ 中断&EDMA事件管脚 2、框图 1、GPIO作为通用输入输出时&#xff0c;用到的寄存器为DIR、SET_DATA、OUT_DATA、CLR_DATA、IN_…

AI奇点已至,是黎明前的黑暗,还是黑夜前的黄昏

2022年11月&#xff0c;OPEN AI公司推出了ChatGPT 3模型&#xff0c;瞬间引爆全球话题&#xff0c;所有业内人士都在感叹他的强大&#xff0c;比尔盖茨也曾经评价道&#xff0c;ChatGPT将会改变世界 &#xff0c;是一个相当于PC和互联网的革命性产品。 作为信息行业人&#xff…

网络请求与远程资源

网络请求与远程资源 网络分层 一、OSI七层模型、TCP/IP概念层模型 区别&#xff1a;OSI模型注重通信协议必要的功能是什么&#xff0c;TCP/IP模型更强调在计算机上实现协议应该开发哪种程序。 二、应用层的网络协议 FTP&#xff1a;文本传输协议SMTP&#xff1a;简单邮件传输协…

简单理解什么是序列化

为什么要序列化 序列化的目的就是为了对象可以在网络层进行传输&#xff0c; 比如通过后端传给前端数据。 什么是序列化 我们以Java为例。 序列化就是把对象转化为可传输的字节序列过程&#xff0c;这个字节序列可以是字符串&#xff0c;比如JSON格式的字符串&#xff0c;把…

基于海洋捕食者算法的极限学习机(ELM)回归预测-附代码

基于海洋捕食者算法的极限学习机(ELM)回归预测 文章目录 基于海洋捕食者算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于海洋捕食者算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;本文利用海洋捕食者算法对极限学习…

一种结合白平衡统计信息和曝光信息的软光敏算法专利学习

背景技术 随着科技的发展&#xff0c;对视频监控设备提出了越来越高的要求。大部分视频监控设备 都需要能够全天候的监控。ICR的中文名称为双滤光片切换器&#xff0c;是用于让滤光片白天切换到红外截止滤光片和晚上切换到全光谱滤光片的监控设备配件。白天的时候&#xff0c…

2023年5月3日 单调栈及其应用

文章目录 单调栈的应用[830. 单调栈 - AcWing题库](https://www.acwing.com/problem/content/description/832/)[P5788 【模板】单调栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)](https://www.luogu.com.cn/problem/P5788)[84. 柱状图中最大的矩形 - 力扣&#xff08;Lee…

chatGPT的翻译能力如何-GPT批量翻译软件

ChatGPT翻译软件 如果您正在为翻译工作而烦恼&#xff0c;或者需要面对语种广泛的国际化业务&#xff0c;那么ChatGPT翻译软件是您的不二之选。 ChatGPT翻译软件基于自然语言处理技术&#xff0c;利用先进的机器学习算法和深度神经网络模型&#xff0c;能够快速、高效地进行多…

将Egg项目部署到阿里云服务器

目录 1、连接阿里云服务器&#xff0c;上传文件 2、在阿里云服务器上安装Nodejs 3、下载项目依赖 4、安装 egg-scripts 模块 5、启动项目 6、阿里云服务器开启7001端口 1、连接阿里云服务器&#xff0c;上传文件 推荐使用FileZilla Client工具连接云服务器&#xff0c;可…