通过Date类来实现对于前文学习接触的赋值型重载,构造函数,析构函数,下面分为三个文件
1.test.cpp 进行测试的.cpp文件
2.Date.h Date的头文件,里面是Date类的成员函数声明和成员变量
3.Date.cpp 对于头文件Date.h的处理,定义Date的成员函数
Date.h
头文件,包括Date类的成员变量和成员函数的声明
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Date {
public:
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);
int getDays(const Date& d);
private:
int _year;
int _month;
int _day;
};
Date.cpp
对于Date.h头文件的成员函数进行定义,实现赋值重载和运算符重载
#define _CRT_SECURE_NO_WARNINGS
#include"Date.h"
//Date:: 开放类域
Date::Date(int year, int month , int day) {
_year = year;
_month = month;
_day = day;
}
// d2(d1)
//拷贝构造函数
Date::Date(const Date& d) {
if (this != &d) {
_year = d._year;
_month = d._month;
_day = d._day;
}
}
// 赋值运算符重载
// d2 = d3 -> d2.operator=(&d2, d3)
Date& Date::operator=(const Date& d) {
(*this)._year = d._year;
(*this)._month = d._month;
(*this)._day = d._day;
return *this;
}
Date::~Date() {
cout <<(this)<< "调用析构函数" << endl;
}
Date& Date::operator+=(int day) {
_day += day;
while (_day > getDays(*this)) {
_day -= getDays(*this);
_month++;
if (_month == 13) {
_month = 1;
_year++;
}
}
return *this;
}
//+的话不能改变this的数值,所以需要使用临时变量
Date Date::operator+(int day) {
Date p = *this;
p.operator+=(day);
return p;
}
//日期相减
Date Date::operator-(int day) {
Date p = *this;
p._day-= day;
if (p._day > 0) {
return p;//如果减去天数之后,day是个整数,说明还在这个月内,只是天数小了,所以可以直接返回
}
p._day = abs(p._day);//反之取得绝对值,然后跟上一个月的天数比较,如果大于,那就减去
while (true) {
p._month--;
if (p._month == 0) {
p._month = 12;
}
if (p._day > getDays(p)) {
p._day -= getDays(p);
}
else {
p._day = getDays(p) - p._day;
return p;
}
}
}
Date& Date::operator-=(int day) {
*this = (*this).operator-(day);
return *this;
}
//前置++ 括号为无参函数
Date& Date::operator++() {
(*this).operator+=(1);
return *this;
}
//后置++,括号中的形参为int类型 没有实际意义,只是为了区分前置和后置++
Date Date::operator++(int) {
//后置++ 需要使用临时变量
Date date = *this;
(*this).operator+=(1);
return date;//返回的是形参,需要进行拷贝赋值返回处理
}
//获得对应月的天数
int Date::getDays(const Date& d) {
int day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (d._month == 2 && ((d._year % 4 == 0 && d._year % 100 != 0) || d._year % 400 == 0)) {
return 29;
}
else {
return day[d._month];
}
}
// 后置--
Date Date::operator--(int) {
Date date = (*this);
(*this).operator-=(1);
return date;
}
//
// 前置--
Date& Date::operator--() {
(*this).operator-=(1);
return *this;
}
// >运算符重载
//日期大小比较:如果日期靠后,就大,反之为小
bool Date::operator>(const Date& d) {
if ((*this)._year > d._year) {
return true;
}
else if(((*this)._year == d._year)&&((*this)._month>d._month)) {
return true;
}
else if (((*this)._year == d._year) && ((*this)._month > d._month) && ((*this)._day > _day)) {
return true;
}
else {
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).operator>(d) || (*this).operator==(d);
}
//
// <运算符重载
bool Date::operator < (const Date& d) {
if ((*this).operator>=(d)) {
return false;
}
else {
return true;
}
}
<=运算符重载
bool Date::operator <= (const Date& d) {
return (*this).operator<(d) || (*this).operator==(d);
}
// !=运算符重载
bool Date::operator != (const Date& d) {
if ((*this).operator==(d)) {
return false;
}
else {
return true;
}
}
// 日期-日期 返回天数
//
bool getyear(int num) {
if ((num % 4 == 0 && num % 100 != 0) || num % 400 == 0) {
return true;
}
else {
return false;
}
}
int Date::operator-(const Date& d) {
int num = 0;
while ((*this).operator!=(d))
{
(*this).operator++();
num++;
}
return num;
}
test.cpp
里面又main函数,是作为测试用的.cpp文件
#define _CRT_SECURE_NO_WARNINGS
#include"Date.h"
void Test()
{
Date p1(2020,10,10);
//cout << p.getDays(p) << endl;
//p.operator+=(1000);
Date c = p1.operator+(100);//366
cout << p1.operator-(c) << endl;
}
int main()
{
Test();
return 0;
}
这个test.cpp文件里面的Test()函数在进行测试,请自行添加测试
总结
赋值重载的话,返回值有两种
- 如果是临时变量,返回值为类类型 Date
- 如果不是临时变量,是*this 那就是传引用返回 Date&
运算符重载的话,返回值一般是bool,而且有些是可以利用其他运算符重载搞定的
- 比如> 和== 这两个就可以将各种大小比较搞定,是为了提高代码复用率
- 且返回值一般为bool,传参是两个参数,一个是this,一个是const Date& p 使用传引用参数是为了提高效率