【C++】日期类Date(详解)②

简介: - `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。- 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。- 比较运算符重载如`>`, `==`, `<`, `<=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。- `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。```这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。


日期类的-=day和-day
-=day虽然思路和+=差不多,但是逻辑却比+=难搞一些,建议仔细思考后在上手写。

// 日期-=天数
Date& Date::operator-=(int day)
{
// 当减的天数为负时的操作
if (day < 0) {
this += (-day);// 复用了刚才写的+=
return
this;
}
_day -= day;
while (_day < 1) {
--_month;
if (_month == 0) {
--_year;
_month = 12;
}
day += GetMonthDay(_year, _month);
}
return *this;
}

在给_day+=天数时,注意加的是上个月的天数,并非本月天数。写了-=,-的实现也就是简单的复用操作了:

// 日期-天数
Date Date::operator-(int day)
{
Date tmp(*this);
tmp -= day;
return tmp;
}

返回值是否引用返回和+=day和+day是同理的。

前置++和后置++
知道内置类型的前置++和后置++吗?如++a,a++等,它们的作用都是给变量a自增1,学了这么长时间,你是否对它们的区别了如指掌。本篇我们讲的是自定义类型的自增,如,日期类,我们要给一个自定义类型(日期类)自增,但计算机并不知道日期自增的规则,这时就需要人为提供内置类型的自增运算符。其实,上面刚刚讲过复用,我们直接复用+=和-=就可以了,你想想,什么是++?什么是--?不就是+=1和-=1嘛!

// 前置++:返回+1之后的结果
Date& Date::operator++()
{
this += 1;
return
this;
}

如果不提供参数,在C++的定义之下,默认就是放到对象前面的重载运算符:++d,但如果单将一个运算符放到对象后面构成运算符重载应该怎么办呢?看看C++提供的解决方式:

// 后置++:自增,返回自增之前的拷贝
Date Date::operator++(int)
{
Date tmp(this); this += 1;
return tmp;
}

前置--和后置--
不想多说了,四个字——同理,复用!

// 前置--
Date& Date::operator--()
{
this -= 1;
return
this;
}

// 后置--
Date Date::operator--(int)
{
Date tmp(this); this -= 1;
return tmp;
}

注意区分前置和后置的区别,控制下返回值是否引用返回就行。

比大小运算符的重载
为什么要给日期提供比大小重载,因为内置类型无法完成比较日期的任务。比大小需要提供的重载函数就多了,包括 <,<=,==,>,>=,!= ,一套写下来,岂不是能把人累瘫,别着急,实际上,需要你完成的实际上只有两个,> 和 ==,当然你选择 < 和 ==,或者 <,!= 统统都可以,如果还没想通,没关系,来看看我是如何实现的,这里以> 和 ==为例。

// >运算符重载
bool Date::operator>(const Date& d)
{
if (_year > d._year
|| _year == d._year && _month > d._month
|| _year == d._year && _month == d._month && _day > d._day) return true;
return false;
}

// ==运算符重载
bool Date::operator==(const Date& d)
{
return _year == d._year
&& _month == d._month
&& _day == d._day;
}

这里是对于>和==的重载,其中逻辑不难理解。

// >=运算符重载
bool Date::operator>=(const Date& d)
{
return this > d || this == d;
}

发现C++运算符重载和复用的魅力了吗?

如果此时你需要一个 < 重载:

// <运算符重载
bool Date::operator<(const Date& d)
{
return !(this > d || this == d);
}

如果此时你需要一个 <= 重载:

// <=运算符重载
bool Date::operator<=(const Date& d)
{
return !(*this > d);
}

如果此时你需要一个 != 重载:

// !=运算符重载
bool Date::operator!=(const Date& d)
{
return !(*this == d);
}

如果……哦,已经没有如果了,这就是所有的比大小运算符重载🙂,很有意思吧。

日期-日期返回天数
日期减日期为的是计算两个日期之间的天数间隔。对于日期相减,这里提供了两种实现方案。

暴力++法
找出日期中小的那个,然后通过记录每次++的次数n来记录两日期之间的间隔,同时设置一个变量flag来记录两个日期之间的差是正的还是负的。

// 日期-日期 返回天数
int Date::operator-(const Date& d)
{
Date max = this;// 假设大的那个是this
Date min = d;
int flag = 1;
int n = 0;
if (this < d) { //判断并重置max和min以及日期间隔正负
max = d;
min =
this;
flag = -1;
}
while (min != max) {
++min;
++n;
}
return n * flag;
}

相关文章
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
60 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
111 5
|
2月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
111 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
148 4
|
3月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
35 4
|
3月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
33 4
|
3月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
30 1
|
3月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
3月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
3月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)