【C++】类和对象——const修饰成员函数和取地址操作符重载

在上篇博客中,我们已经对于日期类有了较为全面的实现,但是,还有一个问题,比如说,我给一个const修饰的日期类的对象
【C++】类和对象——const修饰成员函数和取地址操作符重载_第1张图片
【C++】类和对象——const修饰成员函数和取地址操作符重载_第2张图片

这个对象是不能调用我们上篇博客写的函数的,因为&d1是const Date*类型的,而this指针是Date*类型,&d1传给this是一种权限的放大,这是不行的,所以,我们要改造一下相关函数,就是声明和定义都要加上const,那么具体形式如下
在这里插入图片描述
在这里插入图片描述
不只是这一个函数,像比较大小,加减天数等,凡是不改变this指针指向的内容的值的,都要加const,那么<<这个符号加const吗?不用,因为这不是成员函数,没有this指针
关于日期类的所有代码我会放在这篇文章的最后,下面我们来说最后两个类的默认成员函数,就是取地址操作符重载和const修饰的取地址操作符重载
【C++】类和对象——const修饰成员函数和取地址操作符重载_第3张图片
在这里插入图片描述
【C++】类和对象——const修饰成员函数和取地址操作符重载_第4张图片
这个默认成员函数确实没什么实际的作用,就算我不写这个函数,直接取地址也不会有任何问题,唯一的作用就是你可以选择不返回this,而返回空或一个假地址
Date.h文件

#include
#include
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;
}

你可能感兴趣的:(c++)