当前位置:首页 » 《关注互联网》 » 正文

检验 C++ 入门能力:试试亲手实现日期类吧!

28 人参与  2024年11月21日 08:02  分类 : 《关注互联网》  评论

点击全文阅读


? 快来参与讨论?,点赞?、收藏⭐、分享?,共创活力社区。?

如果你对 类和对象 还存在疑惑,欢迎阅读我之前的作品:

??? 【C++】类的默认成员函数:深入剖析与应用(上)

                【C++】类的默认成员函数:深入剖析与应用(下)


目录

?前言 

?先看看这个Date类的模样

?成员函数的那些事儿

(一)知道每个月有几天的小助手 ——GetMonthDay函数

(二)把日期 “变” 出来的构造函数

(三)给日期 “搬家” 的赋值运算符重载 

(四)清理 “小尾巴” 的析构函数 

(五)日期运算的那些奇妙操作

1. +=运算符重载

2. +运算符重载 

3. -=运算符重载

4. -运算符重载 

5. 前置++运算符重载 

6. 后置++运算符重载 

 7. 后置--运算符重载

8. 前置--运算符重载 

(六)日期比大小的那些事儿

1. >运算符重载

2. ==运算符重载 

3. >=运算符重载 

4. <运算符重载

5. <=运算符重载 

6. !=运算符重载

?总结


?前言 

 嘿,小伙伴们!在 C++ 的编程世界里呀,处理日期可是个挺常见又挺有意思的事儿呢?。今天呀,咱们就来一起瞧瞧怎么实现一个超实用的  Date 类吧?。


?先看看这个Date的模样

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

 这个Date类呀,就像是一个专门管理日期的小管家?‍?,把年、月、日这些信息都妥妥地封装起来啦。而且呢,还准备了好多好用的 “工具”,也就是那些成员函数哦,有了它们,咱们就能轻松对日期进行各种操作啦,是不是很赞呢??

?成员函数的那些事儿

(一)知道每个月有几天的小助手 ——GetMonthDay函数

int Date::GetMonthDay(int year, int month){    static int monthDayArray[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 monthDayArray[month];}

 这个函数可厉害了呀?!它能帮咱们搞清楚指定年份和月份到底有多少天呢。它先弄了个数组,里面存着平年每个月的天数。然后呀,要是月份是 2 月,还得再看看这一年是不是闰年,如果是闰年,2 月就有 29 天啦,不然就是 28 天哦。这样就能准确地告诉咱们每个月的天数啦,是不是很贴心呢??

 

(二)把日期 “变” 出来的构造函数

全缺省构造函数

Date::Date(int year, int month, int day)    : _year(year), _month(month), _day(day){}

这个全缺省构造函数就像是一个魔法棒?呀,当咱们创建Date对象的时候,如果没特意说要哪一年、哪一月、哪一日,它就会自动用默认值(1900 年 1 月 1 日)把这个对象给初始化好呢,是不是很方便呀??

拷贝构造函数

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

拷贝构造函数呢,就像是一个复制小能手?。当咱们想用一个已经存在的Date对象来创建一个新的一模一样的对象时,它就能派上用场啦,新对象和原来的对象有着一模一样的年、月、日值哦,厉害吧?!

 

(三)给日期 “搬家” 的赋值运算符重载 

Date& Date::operator=(const Date& d){    if (this!= &d)    {        _year = d._year;        _month = d._month;        _day = d._day;    }    return *this;}

 这个赋值运算符重载呀,就像是给日期搬家的小卡车?呢。它能把一个Date对象的值搬到另一个Date对象里去哦。不过要注意啦,得先看看是不是自己给自己赋值呢,如果不是,那就可以放心地把值搬过去啦,最后还会把修改后的对象自己给返回回来哦,是不是很有趣呢??

 

(四)清理 “小尾巴” 的析构函数 

Date::~Date(){    // 这里通常不需要进行额外的资源释放操作,因为类中没有动态分配的资源}

析构函数呢,就像是在对象要 “离开” 的时候,帮忙清理一下小尾巴的小助手?。不过咱们这个Date类呀,目前没有动态分配的资源,所以它暂时也没什么特别要清理的啦,就安安静静地在那儿就行咯?。

(五)日期运算的那些奇妙操作

1. +=运算符重载
Date& Date::operator+=(int day){    _day += day;    while (_day > GetMonthDay(_year, _month))    {        _day -= GetMonthDay(_year, _month);        if (_month == 12)        {            _year++;            _month = 1;        }        else        {            _month++;        }    }    return *this;}

哇哦,这个+=运算符重载可太有意思啦?!它能在当前日期的基础上加上指定的天数呢。就好比给日期穿上了一双会 “长大” 的鞋子?,每加一天,日期就会往前走一步。要是加的天数太多,超过了当月的天数,它还会自动调整年和月的值哦

2. +运算符重载 
Date Date::operator+(int day){    Date tmp(*this);    tmp += day;    return tmp;}

 +运算符重载呀,它就像是+=运算符重载的好伙伴?呢。它先弄了一个当前日期的副本,然后让这个副本去用+=运算符加上指定的天数,最后把加好后的副本给返回回来,这样咱们就能得到加上天数后的新日期啦。

3. -=运算符重载
Date& Date::operator-=(int day){    _day -= day;    while (_day <= 0)    {        if (_month == 1)        {            _year--;            _month = 12;        }        else        {            _month--;        }        _day += GetMonthDay(_year, _month);    }    return *this;}

-=运算符重载呢,和+=运算符重载有点相反啦?。它能在当前日期的基础上减掉指定的天数哦,就像是给日期穿了一首会 “变小” 的鞋子?。要是减的天数太多,让日期跑到上个月去了,它也会自动调整年和月的值呢。

4. -运算符重载 
Date Date::operator-(int day){    Date tmp(*this);    tmp -= day;    return tmp;}

-运算符重载又是和-=运算符重载搭档啦?。它先弄一个当前日期的副本,然后让这个副本去用-=运算符减掉指定的天数,最后把减好后的副本给返回回来,这样咱们就能得到减掉天数后的新日期啦。

5. 前置++运算符重载 
Date& Date::operator++(){    *this += 1;    return *this;}

前置++运算符重载呀,就像是给日期按了一个 “快速前进” 的按钮⏩呢。它能让当前日期一下子就往前走一天,而且还会把修改后的对象自己给返回回来哦

6. 后置++运算符重载 
Date Date::operator++(int){    Date tmp(*this);    *this += 1;    return tmp;}

 后置++运算符重载呢,它也能让日期往前走一天,不过它会先弄一个当前日期的副本,然后再让当前日期往前走一天,最后把副本给返回回来,就好像是先拍了个照?,然后再让日期往前走,最后把照片给咱们看一样。

 7. 后置--运算符重载
Date Date::operator--(int){    Date tmp(*this);    *this -= 1;    return tmp;}

 后置--运算符重载和后置++运算符重载有点类似啦?。它先弄一个当前日期的副本,然后让当前日期往后退一天,最后把副本给返回回来,就好像是先拍了个照?,然后再让日期往后退,最后把照片给咱们看一样。

8. 前置--运算符重载 
Date& Date::operator--(){    *this -= 1;    return *this;}

前置--运算符重载呀,就像是给日期按了一个 “快速后退” 的按钮⏪呢。它能让当前日期一下子就往后退一天,而且还会把修改后的对象自己给返回回来哦。


示例代码 for 日期运算相关运算符重载:

 

#include <iostream>using namespace std;int main() {    Date date(2024, 11, 19);    // 使用 += 运算符重载在当前日期基础上增加天数    date += 5;    cout << "增加5天后的日期:" << date._year << "年" << date._month << "月" << date._day << "日。" << endl;    // 使用 + 运算符重载获取增加天数后的新日期    Date newDate = date + 3;    cout << "再增加3天后的新日期:" << newDate._year << "年" << newDate._month << "月" << newDate._day << "日。" << endl;    // 使用 -= 运算符重载在当前日期基础上减少天数    date -= 2;    cout << "减少2天后的日期:" << date._year << "年" << date._month << "月" << date._day << "日。" << endl;    // 使用 - 运算符重载获取减少天数后的新日期    Date anotherDate = date - 1;    cout << "再减少1天后的新日期:" << anotherDate._year << "年" << anotherDate._month << "月" << anotherDate._day << "日。" << endl;    // 使用前置++运算符重载让日期前进一天    ++date;    cout << "前置++后 的日期:" << date._year << "年" << date._month << "月" << date._day << "日。" << endl;    // 使用后置++运算符重载让日期前进一天    Date postIncDate = date++;    cout << "后置++后 的日期:" << date._year << "年" << date._month << "月" << date._day << "日。" << endl;    cout << "返回的副本日期:" << postIncDate._year << "年" << postIncDate._month << "月" << postIncDate._day << "日。" << endl;    // 使用后置--运算符重载让日期后退一天    Date postDecDate = date--;    cout << "后置--后 的日期:" << date._year << "年" << date._month << "月" << date._day << "日。" << endl;    cout << "返回的副本日期:" << postDecDate._year << "年" << postDecDate._month << "月" << postDecDate._day << "日。" << endl;    // 使用前置--运算符重载让日期后退一天    --date;    cout << "前置--后 的日期:" << date._year << "年" << date._month << "月" << date._day << "日。" << endl;    return 0;}

输出结果如下:

在这个示例中,我们创建了一个Date对象date并指定日期为 2024 年 11 月 19 日,然后依次对它进行了各种日期运算相关的操作,通过输出结果可以清晰地看到每个运算符重载的作用和效果哦。 


 

(六)日期比大小的那些事儿

1. >运算符重载
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;}

这个>运算符重载呀,就是用来比较两个日期的大小哦。它会按照年、月、日的顺序依次比较,如果当前日期的年份大于另一个日期的年份,那就说明当前日期更大啦;要是年份相同,就接着比较月份;月份也相同的话,再比较日子呢。只有当所有这些都满足更大的条件时,才会返回true

2. ==运算符重载 
bool Date::operator==(const Date& d){    return (_year == d._year && _month == d._month && _day == d._day);}

 ==运算符重载就简单多了呀,只要当前日期的年、月、日和另一个日期完全一样,那就返回true,否则就是false哦。这就像是在问两个日期是不是双胞胎一样呢?。

3. >=运算符重载 
bool Date::operator >= (const Date& d){    return (*this > d) || (*this == d);}

 >=运算符重载其实就是借助了我们已经实现的>==运算符重载哦。只要当前日期大于或者等于另一个日期,就会返回true啦,是不是很巧妙的组合呀??

4. <运算符重载
bool Date::operator < (const Date& d){    return!(*this >= d);}

<运算符重载就更简单啦,它其实就是>=运算符重载的反义哦。只要当前日期不大于等于另一个日期,那就是小于啦,所以这里直接取>=运算符重载结果的反就可以啦

5. <=运算符重载 
bool Date::operator <= (const Date& d){    return!(*this > d);}

<=运算符重载呢,它是>运算符重载的反义哦。只要当前日期不大于另一个日期,那就是小于等于啦,所以这里直接取>运算符重载结果的反就可以。

6. !=运算符重载
bool Date::operator!= (const Date& d){    return!(*this == d);}

 !=运算符重载就是==运算符重载的反义哦。只要当前日期和另一个日期不相等,那就是不等于啦,所以这里直接取==运算符重载结果的反就可以。


 示例代码 for 日期比大小相关运算符重载:

 

#include <iostream>using namespace std;int main() {    Date date1(2024, 11, 20);    Date date2(2024, 11, 19);    // 使用 > 运算符重载比较两个日期大小    bool result1 = date1 > date2;    if (result1) {        cout << "date1大于date2。" << endl;    } else {        cout << "date1不大于date2。" << endl;    }    // 使用 == 运算符重载判断两个日期是否相等    bool result2 = date1 == date2;    if (result2) {        cout << "date1和date2相等。" << endl;    } else {        cout << "date1和date2不相等。" << endl;    }    // 使用 >= 运算符重载判断两个日期的大小关系    bool result3 = date1 >= date2;    if (result3) {        cout << "date1大于等于date2。" << endl;    } else {        cout << "date1小于date2。" << endl;    }    // 使用 < 运算符重载判断两个日期的大小关系    bool result4 = date1 < date2;    if (result4) {        cout << "date1小于date2。" << endl;    } else {        cout << "date1不小于date2。" << endl;    }    // 使用 <= 运算符重载判断两个日期的大小关系    bool result5 = date1 <= date2;    if (result5) {        cout << "date1小于等于date2。" << endl;    } else {        cout << "date1大于date2。" << endl;    }    // 使用!= 运算符重载判断两个日期是否不相等    bool result6 = date1!= date2;    if (result6) {        cout << "date1和date2不相等。" << endl;    } else {        cout << "date1和date2相等。" << endl;    }    return 0;}

 输出结果如下:

在这个示例中,我们创建了两个不同的Date对象date1date2,分别赋予了不同的日期值。然后通过依次调用各个比较运算符重载函数来判断它们之间的大小关系,并根据返回结果输出相应的信息。这样一来,我们就可以很直观地看到这些运算符重载在实际应用中的效果啦,是不是超级清晰明了呢?? 


?总结

 

通过上面这些详细的介绍呀,咱们是不是对这个Date类的实现有了更清楚的了解啦??以后要是在 C++ 程序里需要处理日期相关的操作,就可以轻松搞定咯,加油呀小伙伴们?!

希望这篇文章能帮助你更好地理解 C++ 日期类的实现以及相关运算符重载的用法哦,如果还有其他疑问,欢迎随时提问呀?。


如果本文对你有帮助欢迎关注我?【A Charmer】   

 


点击全文阅读


本文链接:http://zhangshiyu.com/post/189573.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1