当前位置: 首页 > news >正文

日期类的实现

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

相关文章:

  • 基于复杂的商业和政策信息构建GraphRAG,并结合通义千问大模型进行问答的应用场景
  • 美团Leaf分布式ID实战:深入解析雪花算法原理与应用
  • 网络空间安全(38)Windows/Linux权限
  • 算法刷题记录——LeetCode篇(1) [第1~100题](持续更新)
  • yarn install 出现certificate has expired报错问题
  • 读博士论文(未完待续)
  • (九)Dart 中的 Map(映射)
  • FPGA设计中时间单位科普
  • VS Code使用过程记录
  • Redisson 分布式锁原理
  • MCP(1)
  • 深入解析 Redis 原理:架构、数据结构与高效存储
  • 动态规划(6.不同路径II)
  • Binder机制源码分析
  • 蓝桥杯关于字符串的算法题目(leetcode回文串的判断问题)
  • 【队列】循环顺序队列和链式队列
  • 传感器研习社:臭味传感器(Odorant Sensor)
  • 【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation
  • Java的表达式自动类型提升
  • Netty中的直接内存是怎么回事?
  • 夜读丨永不掉电的陪伴
  • 中疾控:适龄儿童要及时、全程接种百白破疫苗
  • 财政部:4月份中央收入增长1.6%,今年以来首月实现正增长
  • 牛市早报|年内首次存款利率下调启动,5月LPR今公布
  • 新质观察|低空货运是城市发展低空经济的第一引擎
  • 专家:炎症性肠病发病率上升,需加强疾病早期诊断