我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++日期类运算符重载方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++日期类运算符重载方式

构造函数

定义一个全缺省的构造函数,函数体内判断当前日期是否合法,如果是非法日期,则初始化为2022,1,1

Date(int year=2022, int month=1, int day=1)
        :_year(year)
        , _month(month)
        , _day(day)
    {
        if (year <1 || month < 1 || month>12 || day<1 || day>GetDayOfMonth(year,month))
        {
            _year = 2022;
            _month = 1;
            _day = 1;
        }
    }

拷贝构造

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

赋值运算符重载

赋值运算符编译器会默认生成,对于日期类可以不用自己定义,自己定义需要注意三点:

  • 参数和返回值都是类类型的引用
  • 判断是否为自己给自己赋值,因为两对象不能直接比较,所以判断时用地址
  • 为了支持连续赋值,必须返回*this
    Date& operator=(const Date& d)
    {
        //不能用对象直接比较,只能比较地址
        //if (d != (*this))
        if(&d!=this)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }
        return *this;
    }

“+” 日期+天数

"+“与”+=“区分,”+"不改变原变量的值,只是通过返回值返回,所以这里要定义一个临时变量temp,由于temp是保存在栈上的临时变量,所以返回值为Date类型,不能返回引用

先判断正负,如果加的数是负数,则复用"-"的重载

加完后判断_day的合法性,如果_day非法,_day减去当前月份的天数,月份增加,直到日期合法

    //日期+天数
    Date operator+(int day)
    {
        //不能改变原有日期,所以要定义临时变量
        //临时变量不能返回引用
        if (day < 0)
        {
            day = -day;
            return *this - day;
        }
        Date temp=*this;
        temp._day += day;
        while (temp._day > GetDayOfMonth(_year, _month))
        {
            temp._day -= GetDayOfMonth(temp._year,temp._month);
            temp._month++;
            if (temp._month > 12)
            {
                temp._month = 1;
                temp._year++;
            }
        }
        return temp;
    }

“-” 日期-天数

与"+"同原理,如果_day减为0或者负数,先将月份下调一个月,再将日加上上调后月份的天数,如8月0日表示7月31,8月-1日,则表示7月30日。

    //日期-天数
    Date operator-(int day)
    {
        if (day < 0)
        {
            day = -day;
            return *this + day;
        }
        Date temp = *this;
        temp._day -= day;
        while (temp._day <= 0)
        {
            temp._month--;
            if (temp._month < 1)
            {
                temp._year--;
                temp._month = 12;
            }
            temp._day += GetDayOfMonth(temp._year ,temp._month);
        }
        return temp;
    }

“+=” 日期+=天数

"+=“与”+“的区别是,加后要个自己赋值,所以返回类类型对象的引用,可以复用”=“和”+"的重载

    //日期+=天数
    Date& operator+=(int days)
    {
        //复用=和+
        //这里要先将加的和赋值给*this,再返回
        //非常量左值引用只能引用非常量左值
        //如果要直接return(*this + days),返回值类型应为Date&&
        *this = *this + days;
        return * this;
    }

“-=” 日期-=天数

    //日期-=天数
    Date& operator-=(int days)
    {
        *this = *this - days;
        return *this;
    }

前置"++"

前置"++"返回的是加一后的值,可以直接给*this加一后返回

    //前置++
    Date& operator++()
    {
        *this += 1;
        return *this;
    }

后置"++"

C++中,后置"++“参数加一个int,无实际意义,区分前置与后置”++“,由于后置”++"要返回的是自增之前的值,所以要定义一个临时变量,自增后返回该临时变量的值

    //后置++
    //
    Date operator++(int)
    {
        //返回的是自增之前的值
        Date temp = *this;
        *this += 1;
        return temp;
    }

前置"–"

与前置"++"原理相同

    //前置--
    Date& operator--()
    {
        *this -= 1;
        return *this;
    }

后置"- -"

与后置"++"原理相同

    //后置--
    Date operator--(int)
    {
        Date temp = *this;
        *this-= 1;
        return temp;
    }

“==”

判断每变量是否相等

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

“>”

从年到月日依次判断

    //>
    bool operator>(Date& d)const
    {
        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 operator<(Date& d)const
    {
        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;
        }
    }

“-” 日期-日期

定义一个计数器统计从小的日期到大的日期需要自增多少次

    int operator-(const Date& d)const
    {
        int count = 0;
        Date start(*this);
        Date end(d);
        //保证大的日期减小的日期
        if (start>end)
        {
            Date temp = end;
            end = start;
            start = temp;
        }
        while(end>start)
        {
            start++;
            count++;
        }
        return count;
    }

设置年、月、日

对外部提供修改对象值的接口

    void SetYear(int year)
    {
        _year = year;
    }

    void SetMonth(int month)
    {
        _month = month;
    }

    void SetDay(int day)
    {
        _day = day;
    }

获取年、月、日

向外部提供获取类成员变量值的接口

    int GetYear()const
    {
        return _year;
    }

    int GetMonth()const
    {
        return _month;
    }
    
    int GetDay()const
    {
        return _day;
    }

判断闰年

判断闰年,可以定义为private,不用暴露给外部

    bool IsLeapYear(int year)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        {
            return true;
        }
        return false;
    }

获取当前月天数

定义一个数组保存每月的天数,根据传进来的年和月返回当前月份的天数

    //获取当前月份的天数
    int GetDayOfMonth(int year, int month)
    {
        int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
        if (IsLeapYear(year))
        {
            arr[2] = 29;
        }
        return arr[month];
    }

日期类完整代码

class Date
{
public:
    //全缺省构造函数
    Date(int year=2022, int month=2, int day=2)
        :_year(year)
        , _month(month)
        , _day(day)
    {
        if (year <1 || month < 1 || month>12 || day<1 || day>GetDayOfMonth(year,month))
        {
            _year = 2022;
            _month = 1;
            _day = 1;
        }
    }
    //拷贝构造
    Date(const Date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }
    //析构——无实际意义
    ~Date()
    {
        cout << "~Date()" << endl;
    }

    //赋值运算符重载(不写也可以,编译器会默认生成)
    Date& operator=(const Date& d)
    {
        //不能用对象直接比较,只能比较地址
        //if (d != (*this))
        if(&d!=this)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }
        return *this;
    }

    //日期+天数
    Date operator+(int day)
    {
        //不能改变原有日期,所以要定义临时变量
        //临时变量不能返回引用
        if (day < 0)
        {
            day = -day;
            return *this - day;
        }
        Date temp=*this;
        temp._day += day;
        while (temp._day > GetDayOfMonth(_year, _month))
        {
            temp._day -= GetDayOfMonth(temp._year,temp._month);
            temp._month++;
            if (temp._month > 12)
            {
                temp._month = 1;
                temp._year++;
            }
        }
        return temp;
    }

    //日期-天数
    Date operator-(int day)
    {
        if (day < 0)
        {
            day = -day;
            return *this + day;
        }
        Date temp = *this;
        temp._day -= day;
        while (temp._day <= 0)
        {
            temp._month--;
            if (temp._month < 1)
            {
                temp._year--;
                temp._month = 12;
            }
            temp._day += GetDayOfMonth(temp._year ,temp._month);
        }
        return temp;
    }

    //日期+=天数
    Date& operator+=(int days)
    {
        //复用=和+
        //这里要先将加的和赋值给*this,再返回
        //非常量左值引用只能引用非常量左值
        //如果要直接return(*this + days),返回值类型应为Date&&
        *this = *this + days;
        return * this;
    }

    //日期-=天数
    Date& operator-=(int days)
    {
        *this = *this - days;
        return *this;
    }

    //前置++
    Date& operator++()
    {
        *this += 1;
        return *this;
    }
    //后置++
    //C++语法,后置++参数加一个int,无实际意义,区分前置与后置++
    Date operator++(int)
    {
        //返回的是自增之前的值
        Date temp = *this;
        *this += 1;
        return temp;
    }

    //前置--
    Date& operator--()
    {
        *this -= 1;
        return *this;
    }

    //后置--
    Date operator--(int)
    {
        Date temp = *this;
        *this-= 1;
        return temp;
    }
    //==
    bool operator==(Date& d)const
    {
        return d._year == _year &&
            d._month == _month &&
            d._day == _day;
    }

    //>
    bool operator>(Date& d)const
    {
        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 operator<(Date& d)const
    {
        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;
        }
    }
    //日期-日期 即还有多少天到某一天 
    int operator-(const Date& d)const
    {
        int count = 0;
        Date start(*this);
        Date end(d);
        //保证大的日期减小的日期
        if (start>end)
        {
            Date temp = end;
            end = start;
            start = temp;
        }
        while(end>start)
        {
            start++;
            count++;
        }
        return count;
    }

    //设置年、月、日接口
    void SetYear(int year)
    {
        _year = year;
    }

    void SetMonth(int month)
    {
        _month = month;
    }

    void SetDay(int day)
    {
        _day = day;
    }

    //获取年、月、日接口
    int GetYear()const
    {
        return _year;
    }

    int GetMonth()const
    {
        return _month;
    }
    
    int GetDay()const
    {
        return _day;
    }
private:
    int _year;
    int _month;
    int _day;
    //判断闰年
    bool IsLeapYear(int year)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        {
            return true;
        }
        return false;
    }

    //获取当前月份的天数
    int GetDayOfMonth(int year, int month)
    {
        int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
        if (IsLeapYear(year))
        {
            arr[2] = 29;
        }
        return arr[month];
    }
};

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++日期类运算符重载方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++日期类运算符重载方式

这篇文章主要介绍了C++日期类运算符重载方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-06

c++运算符重载的方法是什么

C++中的运算符重载方法是通过定义特殊的成员函数来实现的。重载运算符的函数被称为运算符函数,它们具有特殊的命名规则和语法。一般情况下,运算符函数是作为类的成员函数进行定义的,因为运算符函数需要访问类的私有成员。但有些运算符也可以作为全局函数
2023-09-14

C++运算符重载方法怎么使用

本篇内容介绍了“C++运算符重载方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概念C++为了增强代码的可读性引入了运算符重载,运
2023-06-30

C#怎么实现运算符重载

本篇内容介绍了“C#怎么实现运算符重载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!运算符重载的实现下面的程序演示了完整的实现:using
2023-06-17

C++中运算符重载怎么用

这篇文章主要介绍C++中运算符重载怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!运算符重载为什么要使用运算符重载-C/C++的运算符,支持的数据类型,仅限于基本数据类型。问题:一头牛+一头马 = ?(牛马神兽?
2023-06-29

C#重载运算符怎么定义

本文小编为大家详细介绍“C#重载运算符怎么定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#重载运算符怎么定义”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C# 运算符重载您可以重定义或重载 C# 中内置的
2023-06-17

C#运算符重载“>”的操作

本篇内容主要讲解“C#运算符重载“>”的操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#运算符重载“>”的操作”吧!C#运算符重载“>”的操作问题的出现:今天一个同学在做ProjectHo
2023-06-18

关于C++的重载运算符和重载函数

一般来说,重载运算符在实际的项目开发中会经常的用到,但如果某些自定义类型通过简短几行代码重载一些常用的运算符(如:+-*/),就能让编程工作带来方便,需要的朋友可以参考下本文
2023-05-19

C++重载的奥义之运算符重载详解

函数的重载是指利用相同的函数名设计一系列功能相近,但是功能细节不一样的函数接口;因此运算符重载也是指对于同一个运算符来说,它可以用于实现不同的功能。下面就一起来理解下运算符重载的应用吧
2023-05-16

C++运算符重载怎么理解

这期内容当中小编将会给大家带来有关C++运算符重载怎么理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++当中除了函数可以重载之外,其实运算符也是可以重载的。我们之前已经接触过一些,可能大家没有意识到
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录