手把手教你实现日期类(下)

简介: 手把手教你实现日期类(下)

手把手教你实现日期类(下):https://developer.aliyun.com/article/1624942


同样分为传值和传引用,实现类似于加天数,所以不多加赘述了。

Date Date::operator-(int day) const {
  Date temp = *this;
  temp -= day;
  return temp;
}

这里额外还有日期的加加减减,其中又分为后置和前置C++祖师爷有自己的规定方法,记住就行,而实现方法就直接调用加减天数即可,因为加减天数只是限制成了一天而已。

在头文件的注释中也提到了规定:

   // ++d1 -> d1.operator++()

   Date& operator++();

   

   // d1++ -> d1.operator++(0)

  // 为了区分,构成重载,给后置++,强行增加了一个int形参
   // 这里不需要写形参名,因为接收值是多少不重要,也不需要用
   // 这个参数仅仅是为了跟前置++构成重载区分

   Date operator++(int);

   Date& operator--();

   Date operator--(int);

Date& Date:: operator++() {
  *this += 1;
  return* this;
}
Date Date::operator++(int) {
  Date temp = *this;
  temp += 1;
  return temp;
}
 
Date& Date:: operator--() {
  *this -= 1;
  return*this;
}
Date Date::operator--(int) {
  Date temp = *this;
  temp -= 1;
  return temp;
}

这里同样分为了传值和传引用。

日期-日期

因为日期+日期没有实际意义,所以我们就不用实现了。对于日期-日期,首先我们想到了年月日分别相减再换成天,或者说都换算成天数相减,两者都要计算闰年个数,较为麻烦。

这里我们可以借鉴加加的思想,让小的日期一直+,直到等于大的日期,加的次数就是日期差了。

int Date::operator-(const Date& d) const {
  int flag = 1;
  Date max = *this;
  Date min = d;
  if (*this <  d) {
    max = d;
    min = *this;
    flag = -1;
  }
  int n = 0;
  while (min!=max) {
    ++min;
    n++;
 
  }
  return n * flag;
}

这里用了flag=1/-1,是为了满足日期相减的正负,因为大小日期是个函数内的局部,且小到大算出来的n都是正的,n*flag就满足了实际情况。

3.日期类的输入输出

我们如果想自己定义一个输出输入的话,这里就要用到流输入输出,因为是自定义类型输入输出,所以我们要自己创建。

void Date::operator<<(ostream& out)
{
  out << _year << "年" << _month << "月" << _day << "日" << endl;
}

这种定义实现的时候有个缺陷,因为有默认的this指针,所对应参数就有问题,所以用正常的顺序cout<<就是错的。

Date d(2024, 8, 2);

d << cout;//正确格式

因为Date* this占据了⼀个参数位置,使⽤d<<cout不符合习惯。

所以我们设置了两个参数,ostream& out, const Date&d,理所当然的我们放在了类外,因而又出现了一个问题,访问不了私有成员,在前面的博客中我们提到了几种解决方法,在这里我们采取友元函数的方法,在函数前面加friend,在类里定义,具体的友元讲解在类的对象完结撒花会提到。

函数的模板定义在头文件有详细注明。

ostream& operator<<(ostream& out, const Date& d)
{
  out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
  return out;
}
 
istream& operator>>(istream& in, Date& d)
{
  while (1)
  {
    cout << "请依次输入年月日:>";
    in >> d._year >> d._month >> d._day;
 
    if (!d.CheckDate())
    {
      cout << "输入日期非法:";
      d.Print();
      cout << "请重新输入!!!" << endl;
    }
    else
    {
      break;
    }
  }
 
  return in;
}

输入与输出是类似的思路,只是这里设置了循环来控制输入。

4.测试代码参考

#include "Date.h"
void test1() {
  Date d1(2024, 7, 30);
  d1.Print();
  ++d1;
  ++d1;
  Date ret = d1++;
  ret.Print();
  d1.Print();
  // Date d2 = d1 + 100;
   //d2.Print();
   //d1 += 100;
   //d1.Print();
}
void test2() {
  Date d1(2024, 7, 30);
  Date d2(2024, 7, 30);
  bool result = (d1 >= d2);
  d1 -= 100;
  d1.Print();
  Date d3 = d1 - 100;
  d3.Print();
  --d3;
  d3.Print();
}
void test3() {
  Date d(2024, 8, 2);
  //d << cout;
  cout << d;
  Date d1, d2;
  cin >> d1 >> d2;
  cout << d1 << d2 << endl;
}
int main() {
  
  //Date d2 = d1 + 100;
  //d2.Print();
  //test2();
  /*
  Date d1(2024, 7, 31);
  Date d2(2024, 12, 29);
  cout << d1 - d2 << endl;
  cout << d2 - d1 << endl;
  */
  //test1();
}

可以根据自己的需求进行修改。

结束语

本篇博客到此结束,大家可以根据自己的需求自己添加功能,小编实力有限,所以功能只能实现这么多,大家可以在评论区多多发表自己的观点。

最后给小编点赞支持下吧!!!

目录
相关文章
|
9天前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
17 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
1天前
|
C++
手把手教你实现日期类(上)
手把手教你实现日期类(上)
12 0
|
8天前
|
C++
C++番外篇——日期类的实现
C++番外篇——日期类的实现
36 1
|
2月前
|
编译器 C++
【CPP】手把手教会日期类,日期类实现思路,详细思路
【CPP】手把手教会日期类,日期类实现思路,详细思路
|
5月前
|
编译器 C++
『C++成长记』日期类的实现
『C++成长记』日期类的实现
|
5月前
|
C语言 C++ 容器
[C++从入门到精通] 3.string类型的相关用法
[C++从入门到精通] 3.string类型的相关用法
61 0
[C++从入门到精通] 3.string类型的相关用法
|
5月前
|
C语言
c语言编程练习题:7-12 日期格式化
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
188 0
日期类相关练习题
日期类相关练习题
69 0
|
C++
【C++基础】实现日期类
【C++基础】实现日期类
58 0