IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++类和对象(二) - 日期类的实现 -> 正文阅读

[C++知识库]C++类和对象(二) - 日期类的实现

前言:本文将介绍Date类的具体实现,通过日期类的简单实现帮助我们完整复习一遍类的“六大默认成员函数”。



1.日期类的定义

class Date
{
public:
    // 获取某年某月的天数
    int GetMonthDay(int year, int month);

    // 全缺省的构造函数
    Date(int year=1988, int month=1, int day=1);


    // 拷贝构造函数
    Date(const Date& d);

    // 赋值运算符重载
  // d2 = d3 -> d2.operator=(&d2, d3)
    Date& operator=(const Date& d);


    // 日期+=天数
    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);

    //定义一个函数打印看看
    void print()
    {
        cout << _year << " " << _month << " " << _day << endl;  
    }
private:
    int _year;
    int _month;
    int _day;
};

2.日期类成员函数具体实现

2.1准确获取某年某月有多少天

这里考虑下闰年的情况,然后用数组简单映射下就好了

int Date::GetMonthDay(int year, int month)
{
    //记录每月天数
    int Month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    //遇见闰年,二月天数置29
    if (month == 2 && ((year %4 == 0 && year % 100 != 0) || (year % 400 == 0)))  return 29;
    return Month[month];
}

2.2日期类构造函数

Date::Date(int year, int month, int day)
{
    _year = year;
    _month = month;
    _day = day;
    //检测下日期是否合法
    if (month < 1 || month>12 || day<0 || day>GetMonthDay(year,month))  cout << "非法日期" << endl;
}

2.3日期类拷贝构造

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

2.4赋值运算符重载

类体外定义是成员函数返回值类型+类名::函数名(形参列表)

Date& Date:: operator=(const Date& d)
{
    _year = d._year;
    _month = d._month;
    _day = d._day;
    return *this;   //这个可不能少,少了遇上连续赋值语句a=b=c会出错。
}

2.5+=运算符重载

考虑越界情况

  • 如果_day加了整数以后,<=该月最大天数,则不需要修改,直接返回该日期.
  • 如果_day加了整数以后,>该月最大天数,则_day减去新的月所拥有的最大天数,然后该月加1,.
  • 如果执行了第二步后,_day仍大于新的月所拥有天数,继续执行第二步,并且循环.
Date& Date:: operator+=(int day)
{
    //先把加的天数算进来
    _day += day;
    //考虑加了这个天数之后,_day是否合法,不合法就给他转一下
    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _month = 1;
            _year++;
        }
    }
    return *this;
}

2.6+运算符重载

复用!!!

Date Date::operator+(int day)
{
    //+和+=区别无非就是一个返回的是运算之后的结果,一个返回的是运算之前的结果
    Date tmp(*this);
    *this += day;
    return tmp;
}

2.7-=运算符重载

考虑越界情况,与+=同理

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

2.8+运算符重载

复用!!!

Date Date::operator+(int day)
{
    //+和+=区别无非就是一个返回的是运算之后的结果,一个返回的是运算之前的结果
    Date tmp(*this);
    *this += day;
    return tmp;
}

2.9-运算符重载

复用!!!

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

2.10前置++运算符重载

复用!!!

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

2.11前置–运算符重载

复用!!!

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

2.12后置-- 运算符重载

复用!!!

Date& Date::operator--(int)  //这个int用于区分前置还是后置
{
    Date tmp(*this);
    *this -= 1;
    return tmp;
}

2.13后置++运算符重载

复用!!!

Date& Date::operator++(int)  //这个int用于区分前置还是后置
{
    Date tmp(*this);
    *this += 1;
    return tmp;
}

2.14>运算符重载

bool Date::operator>(const 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;
    return false;
}

2.15==运算符重载

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

2.16>=运算符重载

复用!!!

bool Date::operator>=(const Date& d)
{
    if (*this > d || *this == d) return true;
    return false;
}

2.17<运算符重载

复用!!!

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

2.18<=运算符重载

复用!!!

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

2.19!=运算符重载

复用!!!

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

2.20.计算两个日期之间的间隔天数,日期减去日期

直接从小的日期开始,通过while循环往上加,然后计数,直到等于大的日期为止。

计数结束时,所计的数字便是我们想要的间隔天数。

int Date::operator-(const Date&d)
{
    Date max(*this);
    Date min(d);
    int n = 1;
    if (max < min)
    {
        Date tmp(max);
        max = min;
        min = tmp;
        n = -1;
    }

    int count = 0;
    while (min<=max)
    {
        count++;
        min++;
    }
    return count*n;
}

学以致用一波,精心为大家准备了几道日期类编程题,不妨练练手,完全相似的哦!!!

牛客:日期差值

牛客:计算一年的第几天

牛客:日期累加

牛客:打印日期


3.源码链接

点击跳转代码仓库


感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:12:56  更:2021-11-10 12:13:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:21:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码