请选择 进入手机版 | 继续访问电脑版

[C 语言] C++类与对象之日期类的实现

[复制链接]
查看148 | 回复24 | 2021-9-12 15:14:09 | 显示全部楼层 |阅读模式
目次

1. 实现前的铺垫

在实现前,我们要先把类写好,类中包含

  1. 成员函数和成员变量。<br />
复制代码
对于日期类来说,拷贝构造和赋值运算符可以不写,但是我在类中写了,也不要紧 哦。

  1. #include<iostream>
  2. using std::cout;
  3. using std::endl;
  4. using std::cin;
  5. class Date
  6. {
  7. public:
  8. //构造函数
  9. Date(int year = 0, int month = 1, int day = 1)
  10. {
  11. if (year >= 0 && month > 0 && month<13 && day>0 && day <= GetMonthDay(year, month))
  12. {
  13. _year = year;
  14. _month = month;
  15. _day = day;
  16. }
  17. else
  18. {
  19. cout << "输入日期不和法" << endl;
  20. }
  21. }
  22. //拷贝构造
  23. Date(const Date& d)
  24. {
  25. _year = d._year;
  26. _month = d._month;
  27. _day = d._day;
  28. }
  29. //赋值运算符
  30. Date& operator=(const Date&d)
  31. {
  32. if (this != &d)
  33. {
  34. _year = d._year;
  35. _month = d._month;
  36. _day = d._day;
  37. }
  38. return *this;
  39. }
  40. //判断合法性
  41. int GetMonthDay(int year, int month);
  42. //输出日期
  43. void prit();
  44. //日期+=
  45. Date& operator+=(int day);
  46. //日期+
  47. Date operator+(int day);
  48. //日期-=
  49. Date& operator-=(int day);
  50. //日期-
  51. Date operator-(int day);
  52. //日期==
  53. bool operator==(const Date& d);
  54. //日期>
  55. bool operator>(const Date& d);
  56. //日期!=
  57. bool operator != (const Date& d);
  58. //<
  59. bool operator < (const Date& d);
  60. //>=
  61. inline bool operator >= (const Date& d);
  62. //<=
  63. bool operator <= (const Date& d);
  64. //++d
  65. Date& operator++();
  66. //d++
  67. Date& operator++(int);
  68. //--d
  69. Date& operator--();
  70. //d--
  71. Date& operator--(int);
  72. //日期-日期
  73. int operator-(const Date& d);
  74. private:
  75. int _year;
  76. int _month;
  77. int _day;
  78. };
  79. //给出当年当月的天数
  80. inline int Date::GetMonthDay(int year, int month)
  81. {
  82. static int dayArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  83. dayArray[2] = 28;
  84. if (month == 2 && ((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0)
  85. {
  86. dayArray[2] = 29;
  87. }
  88. return dayArray[month];
  89. }
复制代码

2. 日期类的实现

在实现前我们先要使用 复用,复用就是把已经写好的函数来完成要完成的函数。

2.1 日期+=天数

在这里,就复用了(日期-=天数的)函数
对于+=,当加一个天数是为正的时间 (如:100),
但当加的天数为负数时(如:-100)
这里就要先判定 day是否为正负数
假如 为正数就正常加,假如 是负数就复用-=操作符重载函数

具体 请看下面:

  1. Date& Date::operator+=(int day)
  2. {
  3. if (day > 0)
  4. {
  5. _day += day;
  6. while (_day > GetMonthDay(_year, _month))
  7. {
  8. _day -= GetMonthDay(_year, _month);
  9. _month++;
  10. if (_month > 12)
  11. {
  12. _year++;
  13. _month = 1;
  14. }
  15. }
  16. }
  17. else
  18. {
  19. *this -= (-day);
  20. }
  21. return *this;
  22. }
复制代码

2.2 日期-=天数

这里也和+=操作符重载函数一样,都要判定 day是否为正负值

  1. Date& Date::operator-=(int day)
  2. {
  3. if (day > 0)
  4. {
  5. _day -= day;
  6. while (_day <= 0)
  7. {
  8. _month--;
  9. _day += GetMonthDay(_year, _month);
  10. if (_month == 0)
  11. {
  12. _year--;
  13. _month = 12;
  14. }
  15. }
  16. }
  17. else
  18. {
  19. *this += (-day);
  20. }
  21. return *this;
  22. }
复制代码

2.3 日期-天数

减天数,本身 没变,以是 要创个暂时 变量。

  1. Date Date::operator-(int day)
  2. {
  3. Date ret(*this);
  4. ret -= day;
  5. return *ret;
  6. }
复制代码

2.4 日期+天数

与减天数同理

  1. Date Date::operator+(int day)
  2. {
  3. Date ret(*this);
  4. ret += day;
  5. return ret;
  6. }
复制代码

2.5 前置++

对于前置和后置,在函数定名 的时间 ,后置的参数列表多一个int来占位。

  1. Date& Date::operator++()
  2. {
  3. *this += 1;
  4. return *this;
  5. }
复制代码

2.6 后置++

  1. Date& Date::operator++(int)
  2. {
  3. Date tmp(*this);
  4. tmp += 1;
  5. return *this;
  6. }
复制代码

2.7 前置–

  1. Date& Date::operator--()
  2. {
  3. *this -= 1;
  4. return *this;
  5. }
复制代码

2.8 后置–

  1. Date& Date::operator--(int)
  2. {
  3. Date tmp(*this);
  4. tmp -= 1;
  5. return *this;
复制代码

2.9 >运算符重载

  1. bool Date::operator>(const Date& d)
  2. {
  3. if (_year > d._year)
  4. {
  5. return true;
  6. }
  7. else if (_year == d._year)
  8. {
  9. if (_month > d._month)
  10. {
  11. return true;
  12. }
  13. else if (_month == d._month)
  14. {
  15. if (_day > d._day)
  16. {
  17. return true;
  18. }
  19. }
  20. }
  21. return false;
  22. }
复制代码

2.10 ==运算符重载

  1. bool Date::operator==(const Date& d)
  2. {
  3. return _year == d._year
  4. &&_month == d._month
  5. &&_day == d._day;
  6. }
复制代码

2.11 >=运算符重载

这里就开始复用>和==的操作符重载函数

  1. bool Date::operator >= (const Date& d)
  2. {
  3. return (*this > d) || (*this == d);
  4. }
复制代码

2.12 <运算符重载

  1. bool Date::operator < (const Date& d)
  2. {
  3. return !(*this>d);
  4. }
复制代码

2.13 <=运算符重载

  1. bool Date::operator <= (const Date& d)
  2. {
  3. return (*this < d) || (*this == d);
  4. }
复制代码

2.14 !=运算符重载

  1. bool Date::operator != (const Date& d)
  2. {
  3. return !(*this == d );
  4. }
复制代码

2.15 日期-日期 返回天数

  1. int Date::operator-(const Date& d)
  2. {
  3. Date max = *this;
  4. Date min = d;
  5. int flag = 1;
  6. if (max < min)
  7. {
  8. max = d;
  9. min = *this;
  10. flag = -1;
  11. }
  12. int m = 0;
  13. while (max!=min)
  14. {
  15. ++min;
  16. ++m;
  17. }
  18. return m*flag;
  19. }
复制代码

2.16 输出

  1. void Date::prit()
  2. {
  3. cout << _year << "年" << _month << "月" << _day << "日" << endl;
  4. }
复制代码

到此这篇关于C++类与对象之日期类的实现的文章就先容 到这了,更多相干 C++日期类内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 阳子1989 | 2021-9-12 16:51:33 | 显示全部楼层
读了admin楼主的帖子,顿时马桶就通了。。。
回复

使用道具 举报

avatar 刘久田 | 2021-9-19 06:46:23 | 显示全部楼层
admin楼主的头像是本人吗?
回复

使用道具 举报

avatar 老顽童760 | 2021-9-19 23:22:09 | 显示全部楼层
看帖不回帖的人就是耍流氓,我回复了!
回复

使用道具 举报

avatar 看不清从bm | 2021-9-26 12:09:49 | 显示全部楼层
收藏了,改天让朋友看看!
回复

使用道具 举报

avatar 身无分文的少年 | 2021-9-26 21:56:27 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 创新2017 | 2021-10-10 19:39:31 | 显示全部楼层
十分赞同admin楼主!
回复

使用道具 举报

avatar 搬运工657 | 2021-10-10 20:00:24 | 显示全部楼层
在哪里跌倒,就在那里多爬一会儿!
回复

使用道具 举报

avatar 珍惜637 | 2021-10-11 20:57:28 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar earth20011 | 2021-10-12 21:46:10 | 显示全部楼层
上次给admin楼主开的药,你都吃完了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则