C++日期类的实现

C++实现日期类

文章目录

  • C++实现日期类
        • 做一个实验的格式与规划
        • 日期计算的介绍
        • 定义类
            • 实现日期的判断
            • 实现构造函数
            • 实现打印函数
            • 日期类合法区间测试
        • 判断模块
            • 条件模块测试
        • 运算模块
            • +=、-=运算测
            • +-运算测试
            • ++运算测试
            • --运算测试
            • 日期运算模块
        • 源码
            • 头文件
            • 定义

做一个实验的格式与规划

格式:声明都在头文件里(.h),定义都在(.cpp)文件里。

规划:

1.先了解所要实现的功能。

2.每当我们完成一个模块就测试,早发现错误早修改错误。避免在后续数据庞大的时候检测,这样会更容易秃头,耗时也更多。

3.定义的传参,以及返回值,区间的合法性,运算时的一些偏差,这个就需要去调试解决。

4.优化代码(去掉重复部分,比如用函数调用)。修bug(检查越界),这个就很重要(不然就会成为这样)

C++日期类的实现_第1张图片

日期计算的介绍

C++日期类的实现_第2张图片

既然要实现日期类,就要实现 日、月、年的判断以及运算。

定义类

class Day
{
public:
	Day(int year = 1, int month = 1, int day = 1);//带参构造
    
	int Get_day(int year, int month)const;//获取月份的天数 因为要判断闰年平年的天数
    void Print()const;//打印
private:
	int _year;
	int _month;
	int _day;
};
实现日期的判断
int Day::Get_day(int year, int month)const
{
	assert(month > 0 && month < 13);
	int monthArr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    //只有闰年2月是29期他都不变
	if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400) == 0))
	{
		return 29;
	}
	else
	{
		return monthArr[month];
	}
}
实现构造函数
Day::Day(int year, int month, int day)
{
	if (month > 0 && month < 13 && day > 0 && day <= Get_day(year, month))
	{
		_year = year;
		_month = month;
		_day = day;
	}
	else
	{
		cout << "日期不合法" << endl;
	}

}
实现打印函数
//格式自定
void Day::Print()const
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
日期类合法区间测试

C++日期类的实现_第3张图片

总体来说也是没有什么问题(实例化,非合法值的判断,打印)

  • 为什么会出现日期不合法还会打印随机值呢?

在调用的时候先进入的是构造函数,在构造函数中拷贝的判断条件并没有进去所以打印日期不合法

而这个时候构造函数对内置类型不做处理,就把随机值给打印了出来

判断模块

首先我们要想清楚我们需要用到什么条件运算符,还有条件运算符之间的关系。

利用函数的关系去构成函数重载;

//因为日期类里有3个变量,所以我们都要对这些变量进行对比才能判断
bool Day::operator==(const Day& d) const
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}
//现在我们实现了==的条件运算符符,那么我们就可以附用他

bool Day::operator!=(const Day& d)const
{
	return !(*this == d);//==取反就是!=
}
//这里也不例外先把一个条件实现出来然后就附用
bool Day::operator<(const Day& d)const
{
	return _year < d._year
		|| _year == d._year && _month < d._month
		|| _year == d._year && _month == d._month && _day < d._day;
}

bool Day::operator<=(const Day& d)const
{
	return (*this == d) || (*this < d);
}

bool Day::operator>(const Day& d)const
{
	return !(*this <= d);

}

bool Day::operator>=(const Day& d)const
{
	return  *this > d || *this == d;
}
条件模块测试

C++日期类的实现_第4张图片

运算模块

这里也是我们要想清楚我们需要实现什么功能用到什么运算符,还有运算符之间的关系。

//这个是重点
void Day::get_day(int day)
{
	while (_day<=0 ||_day > Get_day(_year, _month))
	{
		if (_day > 0)
		{
			_day -= Get_day(_year, _month);
			_month++;
			if (_month == 13)
			{
				_year++;
				_month = 1;
			}
		}
		else
		{
			_month--;
			if (_month == 0)
			{
				_year--;
				_month = 12;
			}
			_day += Get_day(_year, _month);	
		}
	}
}

Day& Day:: operator+=(int day)//引用返回就是要返回本身,因为+=,-=都要对改变自己不本身
{
	if (day < 0)
	{
		_day -= -day;  //+=一个负数就是-=一个整数
		get_day(_day);
		return *this;
	}
	_day += day;
	get_day(_day);
	return *this;
}

Day Day:: operator+(int day)const
{
	Day tmp(*this);//实例化this,拷贝this(这里不用改变自己就不用返回引用)
	tmp += day;
	return tmp;
}

Day& Day::operator-=(int day)
{
	if (day < 0)
	{
		_day += -day;
		get_day( _day);
		return *this;
	}
	_day -= day;
	get_day(_day);
	

	return *this;
}

Day Day::operator-(int day)const
{
	Day tmp(*this);
	tmp -= day;
	return tmp;
}

+=、-=运算测

C++日期类的实现_第5张图片

±运算测试

C++日期类的实现_第6张图片

++运算测试

C++日期类的实现_第7张图片

Day& Day::operator++()//前置
{
	*this += 1;
	return *this;
}

Day Day::operator++(int)const//后置
{
	Day tmp(*this);
	tmp += 1;
	return tmp;
}


Day& Day::operator--()//前置
{
	*this -= 1;
	return *this;
}

Day Day::operator--(int)const//后置
{
	Day tmp(*this);
	tmp -= 1;
	return tmp;
}
–运算测试

C++日期类的实现_第8张图片

日期运算模块
int Day::operator-(const Day& d)const
{
	Day max(*this);
	Day min(d);
	int flag = 1;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;

	}
	int tmp = 0;
	while (min != max)
	{
		++min;
		++tmp;
	}
	return tmp;
}

C++日期类的实现_第9张图片

源码

头文件
#pragma once
#include
using namespace std;
#include

class Day
{
public:
	Day(int year = 1900, int month = 1, int day = 1);//合法日期
	
	int Get_day(int year, int month)const;//拿到闰年平年的月份
    void Print()const;

	//运算符重载
	bool operator>(const Day& d)const;
	bool operator<(const Day& d)const;

	bool operator>=(const Day& d)const;
	bool operator<=(const Day& d)const;

	bool operator==(const Day& d)const;
	bool operator!=(const Day& d)const;

	Day operator+(int day)const;
	Day operator-(int day)const;

	Day& operator+=(int day);
	Day& operator-=(int day);

	Day& operator++();//前置
	Day operator++(int)const;//后置

	Day& operator--();//前置
	Day operator--(int)const;//后置


	int operator-(const Day& d)const;

	void get_day(int day);//运算

private:
	int _year;
	int _month;
	int _day;

};
定义
#include"day_2.h"
int Day::Get_day(int year, int month)const
{
	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];
	}

}

Day::Day(int year, int month, int day)//详细讲
{
	if (month > 0 && month < 13 && day>0&&day <= Get_day(year, month))
	{
		_year = year;
		_month = month;
		_day = day;
	}
	else
	{
		cout << "日期不合法" << endl;
	}

}


void Day::Print()const
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}


bool Day::operator==(const Day& d) const
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}
bool Day::operator!=(const Day& d)const
{
	return !(*this == d);
}

bool Day::operator<(const Day& d)const
{
	return _year < d._year
		|| _year == d._year && _month < d._month
		|| _year == d._year && _month == d._month && _day < d._day;
}

bool Day::operator<=(const Day& d)const
{
	return (*this == d) || (*this < d);
}

bool Day::operator>(const Day& d)const
{
	return !(*this <= d);

}

bool Day::operator>=(const Day& d)const
{
	return  *this > d || *this == d;
}


void Day::get_day(int day)
{

	while (_day<=0 ||_day > Get_day(_year, _month))
	{
		if (_day > 0)
		{
			_day -= Get_day(_year, _month);
			_month++;
			if (_month == 13)
			{
				_year++;
				_month = 1;
			}
		}
		else
		{
			_month--;
			if (_month == 0)
			{
				_year--;
				_month = 12;
			}
			_day += Get_day(_year, _month);
		}
		
		
	}

}
Day& Day:: operator+=(int day)
{
	
	if (day < 0)
	{
		_day -= -day;
		get_day(_day);
		return *this;
	}
	_day += day;
	get_day(_day);
	return *this;
}

Day Day:: operator+(int day)const
{
	Day tmp(*this);//实例化this
	tmp += day;
	return tmp;
}


Day& Day::operator-=(int day)
{
	if (day < 0)
	{
		_day += -day;
		get_day( _day);
		return *this;
	}
	_day -= day;
	get_day(_day);
	

	return *this;
}

Day Day::operator-(int day)const
{
	Day tmp(*this);
	tmp -= day;
	return tmp;
}


Day& Day::operator++()//前置
{
	*this += 1;
	return *this;
}

Day Day::operator++(int)const//后置
{
	Day tmp(*this);
	tmp += 1;
	return tmp;
}


Day& Day::operator--()//前置
{
	*this -= 1;
	return *this;
}



Day Day::operator--(int)const//后置
{
	Day tmp(*this);
	tmp -= 1;
	return tmp;
}


int Day::operator-(const Day& d)const
{
	Day max(*this);
	Day min(d);
	int flag = 1;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;

	}
	int tmp = 0;
	while (min != max)
	{
		++min;
		++tmp;
	}
	return tmp;
}




你可能感兴趣的:(c++,c++,开发语言)