类模块的练习--实现日期类

简介: 类模块的练习--实现日期类

🔎在前面对类的学习中我们已经初步的了解和使用类,现在我们可以尝试独立的实现一个日期类,包括日期类的运算符号重载。

Date.h文件📝

声明头文件,Date类以及类中的各种成员方法✏️

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
//#include<algorithm>
#include<string>
using namespace std;
class Date
{
public:
  // 获取某年某月的天数
  int GetMonthDay(int year, int month)
  {
    static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,
     31 };
    int day = days[month];
    if (month == 2
      && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
    {
      day += 1;
    }
    return day;
  }
  //判断是否是闰年
  bool IsLeap(int year);
  //打印
  void Print() {
    cout << _year << "-" << _month << "-" << _day<< endl;
  }
  //交换两个日期
  void Swap(Date& d1,Date& d2);
  // 全缺省的构造函数
  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 <= (const Date& d);
  // !=运算符重载
  bool operator != (const Date& d);
  // 日期-日期 返回天数
  int operator-(const Date& d);
private:
  int _year;
  int _month;
  int _day;
};

Date.cpp文件📝

定义各种成员方法✏️

#include"Date.h"
 
//判断是否是闰年
bool Date::IsLeap(int year) {
  if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){
    return true;
  }
  return false;
}
//交换两个日期
void Date::Swap(Date& d1,Date& d2) {
  swap(d1._year, d2._year);
  swap(d1._month, d2._month);
  swap(d1._day, d2._day);
}
// 全缺省的构造函数
Date::Date(int year ,int month , int day ) {
  _year = year;
  _month = month;
  _day = day;
}
 
// 拷贝构造函数
// d2(d1)
Date::Date(const Date& d) {
  _year = d._year;
  _month = d._month;
  _day = d._day;
}
 
// 赋值运算符重载
 // d2 = d3 -> d2.operator=(&d2, d3)
Date& Date::operator=(const Date& d){
  _year = d._year;
  _month = d._month;
  _day = d._day;
  return *this;
}
// 析构函数
Date::~Date() {
  _year = 0;
  _month = 0;
  _day = 0;
}
// 日期+=天数
Date& Date::operator+=(int day) {
  while (day) {
    if (_day + day <= GetMonthDay(_year, _month)) {
      _day += day;
      day -= day;
    }
    else {
      int d = GetMonthDay(_year, _month) - _day+1;
      day -= d;
      if (_month == 12) {
        _year++;
      }
      _month = (_month) % 12 + 1;
      _day = 1;
    }
  }
  return *this;
}
// 日期+天数
Date Date::operator+(int day) {
  Date temp(*this);
  while (day) {
    if (temp._day + day <= GetMonthDay(temp._year, temp._month)) {
      temp._day += day;
      day -= day;
    }
    else {
      int d = GetMonthDay(temp._year, temp._month) - temp._day + 1;
      day -= d;
      if (temp._month == 12) {
        temp._year++;
      }
      temp._month = (temp._month) % 12 + 1;
      temp._day = 1;
    }
  }
  return temp;
}
// 日期-天数
Date  Date::operator-(int day) {
  Date temp(*this);
  while (day) {
    if (temp._day - day >=1) {
      temp._day += day;
      day -= day;
    }
    else {
      if (temp._month == 1) {
        temp._year--;
      }
      day -= temp._day;
      temp._month = temp._month == 1 ? 12 : temp._month - 1;
      temp._day = GetMonthDay(temp._day, temp._month);
    }
  }
  return temp;
}
// 日期-=天数
Date& Date::operator-=(int day) {
  
  while (day) {
    if (_day - day >= 1) {
      _day += day;
      day -= day;
    }
    else {
      if (_month == 1) {
        _year--;
      }
      day -= _day;
      _month = _month == 1 ? 12 : _month - 1;
      _day = GetMonthDay(_day, _month);
    }
  }
  return *this;
}
// 前置++
Date& Date::operator++() {
  (*this) += 1;
  return *this;
}
// 后置++
Date  Date::operator++(int) {
  Date temp(*this);
  (*this)++;
  return temp;
}
// 后置--
Date  Date::operator--(int) {
  Date temp(*this);
  (*this)--;
  return temp;
}
// 前置--
Date& Date::operator--() {
  (*this) -= 1;
  return *this;
}
 
// >运算符重载
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;
}
// ==运算符重载
bool  Date::operator==(const Date& d) {
  if (_year == d._year && _month == d._month && _day == d._day)return true;
  return false;
}
// >=运算符重载
bool  Date::operator >= (const Date& d) {
  if ((*this) > d || (*this) == d)return true;
  return false;
}
 
// <运算符重载
bool  Date::operator < (const Date& d) {
  if (!(*this >= d))return true;
  return false;
}
// <=运算符重载
bool  Date::operator <= (const Date& d) {
  if (!(*this > d))return true;
  return false;
}
// !=运算符重载
bool  Date::operator != (const Date& d) {
  if (!(*this == d))return true;
  return false;
}
// 日期-日期 返回天数
int Date::operator-(const Date& d) {
  Date d1 = (*this);
  Date d2 = d;
  if (d1 < d2) {
    Swap(d1, d2);
  }
  int res = 0;
  while (d2 < d1) {
    int t = GetMonthDay(d2._year, d2._month)+1-d2._day;
    if (d2 + t <= d1) {
      d2 += t;
      res += t;
    }
    else {
      int k = d1._day - d2._day;
      d2 += k;
      res += k;
    }
  }
  return res;
}


相关文章
|
1月前
|
C++
【C++】实现日期类相关接口(三)
【C++】实现日期类相关接口
|
1月前
|
C++
【C++】实现日期类相关接口(一)
【C++】实现日期类相关接口
|
1月前
|
C++
【C++】实现日期类相关接口(二)
【C++】实现日期类相关接口
|
3月前
|
安全 Java
12 Java常用类(二)(String类+时间类+BigDecimal类等等)
12 Java常用类(二)(String类+时间类+BigDecimal类等等)
35 2
|
5月前
|
编译器 C++ 存储
【C++语言】类和对象--默认成员函数 (中)
【C++语言】类和对象--默认成员函数 (中)
【C++语言】类和对象--默认成员函数 (中)
|
6月前
|
安全 编译器 程序员
类与对象(二)--类的六个默认成员函数超详细讲解
类与对象(二)--类的六个默认成员函数超详细讲解
类与对象(二)--类的六个默认成员函数超详细讲解
|
6月前
|
算法 编译器 C语言
【C++】构建第一个C++类:Date类
【C++】构建第一个C++类:Date类
67 4
|
编译器 C++
[C++] 类与对象(中)完整讲述运算符重载示例 -- 日期类(Date) -- const成员1
[C++] 类与对象(中)完整讲述运算符重载示例 -- 日期类(Date) -- const成员1
|
安全 编译器 C++
[C++] 类与对象(中)完整讲述运算符重载示例 -- 日期类(Date) -- const成员2
[C++] 类与对象(中)完整讲述运算符重载示例 -- 日期类(Date) -- const成员2
|
编译器
函数的声明和定义(如何分文件使用)
函数的声明和定义(如何分文件使用)