手把手教你实现日期类(下):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(); }
可以根据自己的需求进行修改。
结束语
本篇博客到此结束,大家可以根据自己的需求自己添加功能,小编实力有限,所以功能只能实现这么多,大家可以在评论区多多发表自己的观点。
最后给小编点赞支持下吧!!!