在上篇博客中,我们已经对于日期类有了较为全面的实现,但是,还有一个问题,比如说,我给一个const修饰的日期类的对象
这个对象是不能调用我们上篇博客写的函数的,因为&d1是const Date*类型的,而this指针是Date*类型,&d1传给this是一种权限的放大,这是不行的,所以,我们要改造一下相关函数,就是声明和定义都要加上const,那么具体形式如下
不只是这一个函数,像比较大小,加减天数等,凡是不改变this指针指向的内容的值的,都要加const,那么<<这个符号加const吗?不用,因为这不是成员函数,没有this指针
关于日期类的所有代码我会放在这篇文章的最后,下面我们来说最后两个类的默认成员函数,就是取地址操作符重载和const修饰的取地址操作符重载
这个默认成员函数确实没什么实际的作用,就算我不写这个函数,直接取地址也不会有任何问题,唯一的作用就是你可以选择不返回this,而返回空或一个假地址
Date.h文件
#include<iostream>
#include<assert.h>
using namespace std;
class Date {
public:
Date(int year = 1, int month = 1, int day = 1);
Date* operator&();
const Date* operator&()const;
void Print()const;
int GetMonthDay(int year, int month);
bool operator==(const Date& n);
bool operator!=(const Date& n);
bool operator<(const Date& n);
bool operator<=(const Date& n);
bool operator>(const Date& n);
bool operator>=(const Date& n);
Date& operator+=(int day);
Date operator+(int day);
Date& operator-=(int day);
Date operator-(int day);
Date& operator++();//前置++
Date operator++(int);//后置++
Date& operator--();
Date operator--(int);
int operator-(const Date& d);
friend ostream& operator<<(ostream& out, const Date& d);
friend istream& operator>>(istream& in, Date& d);
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& out, const Date& d);
istream& operator>>(istream& in, Date& d);
Date.cpp文件
#include"Date.h"
Date::Date(int year, int month , int day ) {
_year = year;
_month = month;
_day = day;
if (_year < 1 || _month < 1 || _month>12 || _day<1 || _day>GetMonthDay(_year, _month)) {
cout << _year << "年" << _month << "月" << _day << "日";
cout << "日期非法" << endl;
}
}
Date* Date:: operator&() {
return this;
}
const Date* Date::operator&()const {
return this;
}
void Date::Print() const{
cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
int Date :: GetMonthDay(int year, int month) {
assert(year >= 1 && month >= 1 && month <= 12);
int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if ((month == 2) && (((year % 400) == 0) || ((year % 4) == 0 && (year % 100) != 0))) {
return 29;
}
return monthArray[month];
}
bool Date:: operator==(const Date& n) {
return _year == n._year && _month == n._month && _day == n._day;
}
bool Date::operator!=(const Date& n) {
return !(*this == n);
}
bool Date:: operator<(const Date& n) {
if (_year < n._year) {
return true;
}
if (_year == n._year && _month < n._month) {
return true;
}
if (_year == n._year && _month == n._month && _day < n._day) {
return true;
}
return false;
}
bool Date::operator<=(const Date& n) {
return ((*this < n) || (*this == n));
}
bool Date::operator>(const Date& n) {
return !(*this <= n);
}
bool Date:: operator>=(const Date& n) {
//return *this > n || *this == n;
return !(*this < n);
}
Date& Date:: operator+=(int day) {
if (day < 0) {
return *this -= (-day);
}
if (day < 0) {
return *this -= (-day);
}
_day += day;
while (_day > GetMonthDay(_year, _month)) {
_day -= GetMonthDay(_year, _month);
++_month;
if (_month == 13) {
++_year;
_month = 1;
}
}
return *this;
}
Date Date:: operator+(int day) {
Date tmp(*this);
tmp += day;
return tmp;
}
Date& Date:: operator-=(int day) {
if (day < 0) {
return *this -= (-day);
}
if (day < 0) {
return *this += (-day);
}
_day -= day;
while (_day <= 0) {
--_month;
if (_month == 0) {
--_year;
_month = 12;
}
_day += GetMonthDay(_year, _month);
}
return *this;
}
Date Date:: operator-(int day) {
Date tmp(*this);
tmp -= day;
return tmp;
}
Date& Date::operator++() {
*this += 1;
return *this;
}
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;
}
//int Date::operator-(const Date& d) {
// int flag = -1;
// Date min = *this;
// Date max = d;
// if (*this > d) {
// min = d;
// max = *this;
// flag = 1;
// }
// int n = 0;
// while (min < max) {
// ++min;
// ++n;
// }
// return n*flag;
//}
int Date::operator-(const Date& d) {
int flag = 1;
Date max = *this;
Date min = d;
if (*this < d) {
max = d;
min = *this;
flag = -1;
}
int n = 0;
int y = min._year;
while (y != max._year) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
n += 366;
}
else {
n += 365;
}
y++;
}
int m1 = 1;
int m2 = 1;
while (m1 < max._month) {
n += GetMonthDay(max._year, m1);
m1++;
}
while (m2 < min._month) {
n -= GetMonthDay(min._year, m2);
m2++;
}
n = n + max._day - min._day;
return n;
}
ostream& operator<<(ostream& out, const Date& d) {
out << d._year << "-" << d._month << "-" << d._day << endl;
return out;
}
istream& operator>>(istream& in, Date& d) {
in >> d._year>>d._month >> d._day;
return in;
}