日期类的实现

hellohello,又见面啦!

既然我们已经学过类和对象了,那么我们也可以进行这个日期类的实现了!

这就是我们接下来的任务哦~

先做然后看看我们方法有什么不同吧~

class Date

{

public:

// 获取某年某月的天数

int GetMonthDay(int year, int month);



  // 全缺省的构造函数

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);

private:

int _year;

int _month;

int _day;

};
// 全缺省的构造函数
Date(int year = 1900, int month = 1, int day = 1)
{
	_year = year;
	_month = month;
	_day = day;
}
// 拷贝构造函数
Date(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}
Date& operator=(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}
// 析构函数

~Date()
{
	 _year=0;
	 _month=0;
	 _day=0;
}
int Date::GetMonthDay(int year, int month)
{
	assert(month > 0 && month < 13);//防止用户输入错误的月份
	int MonthArr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//集装成一个数组,不用复杂的判断啦~
	if ((month == 2) && ((year % 4 == 0) && (year % 100 != 0) ||(year % 400 == 0)))
		return  29;
	else
		return MonthArr[month];

}

Date& Date::operator+=(int day)//自身被改变
{
	this->_day += day;
	while (this->_day>GetMonthDay(this->_year, this->_month))
	{
		this->_day -= GetMonthDay(this->_year,this->_month);
		this->_month++;
		if (this->_month > 12)
		{
			this->_month = 1;
			this->_year++;
		}

	}
	return *this;
}

跟+=没什么大区别 ,不过我们还可以通过+=构造+

Date Date::operator+(int day)//不改变自身
{
	Date tmp(*this);
	tmp._day += day;
	while (tmp._day > GetMonthDay(tmp._year, tmp._month))
	{
		tmp._day -= GetMonthDay(tmp._year, tmp._month);
		tmp._month++;
		if (tmp._month > 12)
		{
			tmp._month = 1;
			tmp._year++;
		}

	}
	return tmp;//由于是函数局部域创建的变量,出了函数就会被销毁,所以不能用引用作为返回值
}
Date Date::operator+(int day)//不改变自身
{
	Date tmp(*this);
	tmp += day;
	return tmp;//由于是函数局部域创建的变量,出了函数就会被销毁,所以不能用引用作为返回值
}
Date& Date:: operator-=(int day)
{
	_day -= day;
	while (_day < 0)
	{
		_month--;
		
		if (_month == 0)
		{
			_month = 12 ;
			_year--;
		}
		_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--(int)
{
	Date tmp(*this);
	*this -= 1;
	return tmp;
}

Date& Date::operator--()
{
	*this -= 1;
	return *this;
}
bool Date::operator>(const Date& d)
{
	if (_year>d._year)
		return true;

	else if (_year == d._year)
	{ 
		if(_month>d._month)
		return true;
	}
	else if(_month == d._month)
	{ 
		if (_day> d._day)
		return true;
	}
	else
		return false;
}
bool Date::operator==(const Date& d)
{
	if(_year == d._year
		&& _month == d._month
		&&_day == d._day)
		return true;
	else
		return false;
	
}
bool Date::operator >= (const Date& d)
{
	if(*this > d || *this == d )
		return true;
	else
		return false;
}

bool Date::operator < (const Date& d)
{
	if(!((*this > d)&& (*this == d)))
		return true;
	else
		return false;
}
bool Date::operator <= (const Date& d)
{
	if (*this < d || *this == d)
		return true;
	else
		return false;
}
bool Date::operator != (const Date& d)
{
	if(!(*this==d))
		return true;
	else
		return false;
}

日期减日期

int Date::operator-(const Date& d)
{
	int flag = 1;
	if (*this < d)
	{
		flag = -1;
	}
	Date tmp(d);
	int count=0;
	while (tmp < *this)
	{
		tmp++;
		count++;
		while (tmp._day > GetMonthDay(tmp._year, tmp._month))
		{
			tmp._day -= GetMonthDay(tmp._year, tmp._month);
			tmp._month++;
			if (tmp._month > 12)
			{
				tmp._month = 1;
				tmp._year++;
			}

		}

	}
	return flag*count;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值