• C++日期类实现(联系类和对象)


    目录

    一.6个默认成员函数

    二.基本功能函数

    三.日期与天数的加减

    四.前后置++和--

    五.比较运算符重载

    六.日期减日期

    七.全部代码

            1.Date.h

            2.Date.cpp


    C++初学者都可以在学习完类和对象后写一个日期类,以下是实现细节。

    一.6个默认成员函数

            对于日期类默认成员函数使用编译器生成的足矣,这里就不多赘述。

            提醒一下对于赋值运算符重载需要判断是不是自己给自己赋值。

    二.基本功能函数

            对于我们实现日期+-天数有用的基本功能函数。

            1.GetMonthDay(返回对应月份的天数,也考虑了闰年二月天数变化)

    1. // 获取某年某月的天数
    2. int Date::GetMonthDay(int year, int month)
    3. {
    4. static int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//数组扩大1下标就不用-1了
    5. if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))//判断闰年
    6. return arr[month] + 1;
    7. return arr[month];
    8. }

            2.Judge(判断月份是否合法)

    1. //判断日期是否合法
    2. bool Date::judge()
    3. {
    4. if (_month <= 12 && _month > 0 && _day <= GetMonthDay(_year, _month) && (_day > 0))//判断月份和天数是不是正常的
    5. return true;
    6. return false;
    7. }

            3.Print(输出日期)

    1. //输出日期
    2. void Date::Print()
    3. {
    4. cout << _year << " " << _month << " " << _day << endl;
    5. }

    三.日期与天数的加减

            我们可以实现+=和-=的功能,然后+和-分别复用+=和-=的功能。

            1.+=和+

    1. // 日期+=天数
    2. Date& Date::operator+=(int day)//可以理解为让日期一个月一个月往前走
    3. {
    4. _day += day;//直接把天数加上去
    5. while (!judge())//一直对日期进行处理,直到合法为止
    6. {
    7. _day -= GetMonthDay(_year, _month);//这里注意_day是先减_month是后++的
    8. _month++;
    9. if (_month == 13)//月份越界就让年份加1,相当于月份变为下一年的1月
    10. {
    11. _year++;
    12. _month = 1;
    13. }
    14. }
    15. return *this;//引用返回就直接返回*this
    16. }
    17. // 日期+天数
    18. Date Date::operator+(int day)
    19. {
    20. Date tmp(*this);//创建临时对象
    21. tmp += day;//复用+=
    22. return tmp;//不是引用返回所以是返回临时对象
    23. }

            2.-=和-

    1. // 日期-=天数
    2. Date& Date::operator-=(int day)//可以理解让日期一个月一个月往后退
    3. {
    4. _day -= day;//和+=一样直接让_day减day
    5. while (!judge())//一直对日期处理直到合法为止
    6. {
    7. _month--;
    8. if (_month == 0)//月份非法就让year-1,相当于是到了去年的12月
    9. {
    10. _year--;
    11. _month = 12;
    12. }
    13. _day += GetMonthDay(_year, _month);//注意这里是月份先减1,然后才加天数,和+=是相反的
    14. }
    15. return *this;//引用返回所以是返回*this
    16. }
    17. // 日期-天数
    18. Date Date::operator-(int day)
    19. {
    20. Date tmp(*this);//创建临时对象
    21. tmp -= day;//复用-=
    22. return tmp;//不是引用返回所以是返回临时对象
    23. }

    四.前后置++和--

            ++和--复用+=和-=就可以,需要注意的是前置和后置在函数原型上的区别。

            1.++

    1. // 前置++
    2. Date& Date::operator++()
    3. {
    4. *this += 1;//复用+=
    5. return *this;//注意是引用返回
    6. }
    7. // 后置++
    8. Date Date::operator++(int)//后置++需要在参数表加一个int用来占位,用来区分前后置++,编译器会进行特殊处理
    9. {
    10. ++(*this);//自身也要++
    11. Date tmp(*this);//创建临时对象
    12. return tmp;//注意事项传值返回
    13. }

            2.--

    1. // 前置--
    2. Date& Date::operator--()
    3. {
    4. *this -= 1;//复用-=
    5. return *this;//注意是引用返回
    6. }
    7. // 后置--
    8. Date Date::operator--(int)//后置--需要在参数表加一个int用来占位,用来区分前后置--,编译器会进行特殊处理
    9. {
    10. --(*this);//自身也要--
    11. Date tmp(*this);//创建临时对象
    12. return tmp;//注意事项传值返回
    13. }

    五.比较运算符重载

            只需要实现==和>或<,其他的比较运算符复用前两个就行。

    1. // >运算符重载
    2. bool Date::operator>(const Date& d)
    3. {
    4. if (_year > d._year)//判断年份大小
    5. return true;
    6. else if (_year == d._year && _month > d._month)//判断月份大小
    7. return true;
    8. else if (_year == d._year && _month == d._month && _day > d._day)//判断天数大小
    9. return true;
    10. else
    11. return false;
    12. }
    13. // ==运算符重载
    14. bool Date::operator==(const Date& d)
    15. {
    16. if (_year == d._year && _month == d._month && _day == d._day)//全部都一样就返回true
    17. return true;
    18. return false;
    19. }
    20. // >=运算符重载
    21. bool Date::operator >= (const Date& d)
    22. {
    23. return *this > d || *this == d;//>=就是>或者==
    24. }
    25. // <运算符重载
    26. bool Date::operator < (const Date& d)
    27. {
    28. return !(*this > d || *this == d);//<就是>=的取反
    29. }
    30. // <=运算符重载
    31. bool Date::operator <= (const Date& d)
    32. {
    33. return !(*this > d);//<=就是>的取反
    34. }
    35. // !=运算符重载
    36. bool Date::operator != (const Date& d)
    37. {
    38. return !(*this == d);//!=就是==的取反
    39. }

    六.日期减日期

            日期-日期的实现方式有很多,我们这里直接用暴力,就是用小日期一直++天数,直到等于大的日期为止(优化版本就是按月来算)。另一种方式是让两个日期都对一个小的日期计算天数,然后再相减(不用判断谁大谁小)。

    1. // 日期-日期 返回天数
    2. int Date::operator-(const Date& d)
    3. {
    4. Date tmp, target;//用两个临时变量计算
    5. int day = 0, flag = 0;//day是计算天数,flag是判断*this是否小于d
    6. if (*this < d)
    7. {
    8. flag = 1;//*this小于d,令flag=1
    9. tmp = (*this);//tmp默认是小的日期
    10. target = (d);//target默认是大的日期
    11. }
    12. else
    13. {
    14. tmp = (d);//tmp默认是小的日期
    15. target = (*this);//target默认是大的日期
    16. }
    17. while (tmp != target)//两个日期不相等就一直处理
    18. {
    19. tmp++;//小日期++
    20. day++;//计算天数差值
    21. }
    22. if (flag)//如果*this小于d,那么天数差值就是负数
    23. day *= -1;
    24. return day;
    25. }

    七.全部代码

            1.Date.h

    1. #pragma once
    2. class Date
    3. {
    4. public:
    5. // 获取某年某月的天数
    6. int GetMonthDay(int year, int month);
    7. //判断日期是否合法
    8. bool judge();
    9. //输出日期
    10. void Print();
    11. // 全缺省的构造函数
    12. Date(int year = 1900, int month = 1, int day = 1)
    13. {
    14. _year = year;
    15. _month = month;
    16. _day = day;
    17. }
    18. // 拷贝构造函数
    19. // d2(d1)
    20. Date(const Date& d);
    21. // 赋值运算符重载
    22. // d2 = d3 -> d2.operator=(&d2, d3)
    23. Date& operator=(const Date& d);
    24. // 析构函数
    25. ~Date();
    26. // 日期+=天数
    27. Date& operator+=(int day);
    28. // 日期+天数
    29. Date operator+(int day);
    30. // 日期-天数
    31. Date operator-(int day);
    32. // 日期-=天数
    33. Date& operator-=(int day);
    34. // 前置++
    35. Date& operator++();
    36. // 后置++
    37. Date operator++(int);
    38. // 后置--
    39. Date operator--(int);
    40. // 前置--
    41. Date& operator--();
    42. // >运算符重载
    43. bool operator>(const Date& d);
    44. // ==运算符重载
    45. bool operator==(const Date& d);
    46. // >=运算符重载
    47. bool operator >= (const Date& d);
    48. // <运算符重载
    49. bool operator < (const Date& d);
    50. // <=运算符重载
    51. bool operator <= (const Date& d);
    52. // !=运算符重载
    53. bool operator != (const Date& d);
    54. // 日期-日期 返回天数
    55. int operator-(const Date& d);
    56. private:
    57. int _year;
    58. int _month;
    59. int _day;
    60. };

            2.Date.cpp

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include"Date.h"
    4. using namespace std;
    5. // 获取某年某月的天数
    6. int Date::GetMonthDay(int year, int month)
    7. {
    8. static int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//数组扩大1下标就不用-1了
    9. if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))//判断闰年
    10. return arr[month] + 1;
    11. return arr[month];
    12. }
    13. //判断日期是否合法
    14. bool Date::judge()
    15. {
    16. if (_month <= 12 && _month > 0 && _day <= GetMonthDay(_year, _month) && (_day > 0))//判断月份和天数是不是正常的
    17. return true;
    18. return false;
    19. }
    20. //输出日期
    21. void Date::Print()
    22. {
    23. cout << _year << " " << _month << " " << _day << endl;
    24. }
    25. // 拷贝构造函数
    26. // d2(d1)
    27. Date::Date(const Date& d)
    28. {
    29. _year = d._year;
    30. _month = d._month;
    31. _day = d._day;
    32. }
    33. // 赋值运算符重载
    34. // d2 = d3 -> d2.operator=(&d2, d3)
    35. Date& Date::operator=(const Date& d)
    36. {
    37. if (&d != this)
    38. {
    39. _year = d._year;
    40. _month = d._month;
    41. _day = d._day;
    42. return *this;
    43. }
    44. }
    45. // 析构函数
    46. Date::~Date()
    47. {
    48. _year = 0;
    49. _month = 0;
    50. _day = 0;
    51. }
    52. // 日期+=天数
    53. Date& Date::operator+=(int day)//可以理解为让日期一个月一个月往前走
    54. {
    55. _day += day;//直接把天数加上去
    56. while (!judge())//一直对日期进行处理,直到合法为止
    57. {
    58. _day -= GetMonthDay(_year, _month);//这里注意_day是先减_month是后++的
    59. _month++;
    60. if (_month == 13)//月份越界就让年份加1,相当于月份变为下一年的1月
    61. {
    62. _year++;
    63. _month = 1;
    64. }
    65. }
    66. return *this;//引用返回就直接返回*this
    67. }
    68. // 日期+天数
    69. Date Date::operator+(int day)
    70. {
    71. Date tmp(*this);//创建临时对象
    72. tmp += day;//复用+=
    73. return tmp;//不是引用返回所以是返回临时对象
    74. }
    75. // 日期-天数
    76. Date Date::operator-(int day)
    77. {
    78. Date tmp(*this);//创建临时对象
    79. tmp -= day;//复用-=
    80. return tmp;//不是引用返回所以是返回临时对象
    81. }
    82. // 日期-=天数
    83. Date& Date::operator-=(int day)//可以理解让日期一个月一个月往后退
    84. {
    85. _day -= day;//和+=一样直接让_day减day
    86. while (!judge())//一直对日期处理直到合法为止
    87. {
    88. _month--;
    89. if (_month == 0)//月份非法就让year-1,相当于是到了去年的12月
    90. {
    91. _year--;
    92. _month = 12;
    93. }
    94. _day += GetMonthDay(_year, _month);//注意这里是月份先减1,然后才加天数,和+=是相反的
    95. }
    96. return *this;//引用返回所以是返回*this
    97. }
    98. // 前置++
    99. Date& Date::operator++()
    100. {
    101. *this += 1;//复用+=
    102. return *this;//注意是引用返回
    103. }
    104. // 后置++
    105. Date Date::operator++(int)//后置++需要在参数表加一个int用来占位,用来区分前后置++,编译器会进行特殊处理
    106. {
    107. ++(*this);//自身也要++
    108. Date tmp(*this);//创建临时对象
    109. return tmp;//注意事项传值返回
    110. }
    111. // 后置--
    112. Date Date::operator--(int)//后置--需要在参数表加一个int用来占位,用来区分前后置--,编译器会进行特殊处理
    113. {
    114. --(*this);//自身也要--
    115. Date tmp(*this);//创建临时对象
    116. return tmp;//注意事项传值返回
    117. }
    118. // 前置--
    119. Date& Date::operator--()
    120. {
    121. *this -= 1;//复用-=
    122. return *this;//注意是引用返回
    123. }
    124. // >运算符重载
    125. bool Date::operator>(const Date& d)
    126. {
    127. if (_year > d._year)//判断年份大小
    128. return true;
    129. else if (_year == d._year && _month > d._month)//判断月份大小
    130. return true;
    131. else if (_year == d._year && _month == d._month && _day > d._day)//判断天数大小
    132. return true;
    133. else
    134. return false;
    135. }
    136. // ==运算符重载
    137. bool Date::operator==(const Date& d)
    138. {
    139. if (_year == d._year && _month == d._month && _day == d._day)//全部都一样就返回true
    140. return true;
    141. return false;
    142. }
    143. // >=运算符重载
    144. bool Date::operator >= (const Date& d)
    145. {
    146. return *this > d || *this == d;//>=就是>或者==
    147. }
    148. // <运算符重载
    149. bool Date::operator < (const Date& d)
    150. {
    151. return !(*this > d || *this == d);//<就是>=的取反
    152. }
    153. // <=运算符重载
    154. bool Date::operator <= (const Date& d)
    155. {
    156. return !(*this > d);//<=就是>的取反
    157. }
    158. // !=运算符重载
    159. bool Date::operator != (const Date& d)
    160. {
    161. return !(*this == d);//!=就是==的取反
    162. }
    163. // 日期-日期 返回天数
    164. int Date::operator-(const Date& d)
    165. {
    166. Date tmp, target;//用两个临时变量计算
    167. int day = 0, flag = 0;//day是计算天数,flag是判断*this是否小于d
    168. if (*this < d)
    169. {
    170. flag = 1;//*this小于d,令flag=1
    171. tmp = (*this);//tmp默认是小的日期
    172. target = (d);//target默认是大的日期
    173. }
    174. else
    175. {
    176. tmp = (d);//tmp默认是小的日期
    177. target = (*this);//target默认是大的日期
    178. }
    179. while (tmp != target)//两个日期不相等就一直处理
    180. {
    181. tmp++;//小日期++
    182. day++;//计算天数差值
    183. }
    184. if (flag)//如果*this小于d,那么天数差值就是负数
    185. day *= -1;
    186. return day;
    187. }

  • 相关阅读:
    thingsboard IoT gateway OPC-UA 连接器配置
    CSS 简介&三种样式写法
    docker系列(一):Docker的三个基本概念
    使用comicai绘制漫画
    机器学习案例(六):加密货币价格预测
    非对称密码体制详解
    Banana Pi BPI-W3之RK3588安装Qt+opencv+采集摄像头画面.
    JavaScript - 将 Allegro 坐标文件转为嘉立创坐标文件(CSV 格式)的工具
    java中的锁
    HMS Core使能AI智慧体验,共建创新应用生态
  • 原文地址:https://blog.csdn.net/ZM_QMZS/article/details/132832582