(个人练习)日期类实现(c++)

学习类和对象时候练习的一个日期类,适合初学者,供大家参考。

Date.h

#pragma once
#include<iostream>
#include<assert.h>


class Date
{
    
    
	//友元函数  -- 这个函数内部可以使用Date对象私有保护的成员
	friend std::ostream& operator<<(std::ostream& out, const Date& d);
	friend std::istream& operator>>(std::istream& in, Date& d);

public:
	// 频繁调用写成内联
	int GetMonthDay(int year, int month)
	{
    
    
		//静态频繁调用
		static int days[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;
		}
		else
		{
    
    
			return days[month];
		}

	}
	bool CheckDate(Date & d)
	{
    
    
		return d._year >= 1 &&
			d._month >= 1 && d._month <= 12
			&& d._day >= 1 && d._day <= GetMonthDay(_year, _month);
	}

	//全缺省构造函数
	Date(int year = 1970, int month = 1, int day = 1);

	//拷贝构造
	Date(const Date& d);

	//赋值运算符重载
	Date& operator=(const Date& d);
	
	//析构函数
	~Date();

	//取地址运算符重载
	Date* operator&()
	{
    
    
		return this;
	}
	//通过这样设置可以保证,类外面的成员只能访问地址,不能修改地址。
	const Date* operator&()const
	{
    
    
		return this;
	}

	//运算符重载
	//日期+=天数
	Date& operator+=(int day);

	//日期+天数
	Date operator+(int day) const;

	//日期-天数
	Date operator-(int day) const;

	//日期-天数
	Date& operator-=(int day);

	// 前置++
	Date& operator++();

	//后置 ++
	Date operator++(int);

	// 前置--
	Date& operator--();

	//后置 --
	Date operator--(int);

	bool operator>(const Date& d) const;
	bool operator==(const Date& d) const;

	bool operator>=(const Date& d) const;

	bool operator<(const Date& d) const;
	bool operator<=(const Date& d) const;

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

	void Print() const;

	//void operator<<(std::ostream& out);

	//日期减日期
	int operator-(const Date& d) const;
private:
	int _year;
	int _month;
	int _day;
};


// 因为会频繁的调用,所以搞成内联函数
//又因为内联函数声明和定义最好不要分离,所以写一块
//inline std::ostream& operator<<(std::ostream& out, const Date& d);



//<<运算符重载
// 第二个参数是传this 用的
inline std::ostream& operator<<(std::ostream& out, const Date& d)
{
    
    
	out << d._year << "年" << d._month << "月" << d._day << "日" << std::endl;
	return out;
}

//流提取

inline std::istream& operator>>(std::istream& in, Date& d)
{
    
    
	in >> d._year >> d._month >> d._day;
	assert(d.CheckDate(d));
	return in;
}

Date.cpp

#include<iostream>
#include<assert.h>
#include"Date.h"
using namespace std;


// 构造
//本身日期就有问题
Date::Date(int year, int month, int day)
{
    
    
	_year = year;
	_month = month;
	_day = day;
	//日期非法
	assert(CheckDate(*this));
}
// 拷贝构造
Date::Date(const Date& d)
{
    
    
	_year = d._year;
	_month = d._month;
	_day = d._day;
	cout << "Date" << endl;
}


//赋值运算符重载
Date& Date::operator=(const Date& d)
{
    
    
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}

//析构函数
Date::~Date()
{
    
    
	cout << "~Date" << endl;
}

//运算符重载
//日期+=天数
Date& Date::operator+=(const int day)
{
    
    
	if (day < 0)
	{
    
    
		return *this -= -day;
	}
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
    
    
		_day -= GetMonthDay(_year, _month);
		_month++;
		if (_month > 12)
		{
    
    
			_year++;
			_month -= 12;
		}
	}
	return *this;
}


//日期+天数
Date Date::operator+(const int day) const
{
    
    
	Date d(*this);

	return d += day;

}


//日期-=天数
Date& Date::operator-=(const int day)
{
    
    
	if (day < 0)
	{
    
    
		return *this += -day;
	}
	_day -= day;
	while (_day <= 0)
	{
    
    
		//注意1月-1,变成0月
		if (1 == _month)
		{
    
    
			_month = 12;
			_year--;
		}
		else
		{
    
    
			_month--;
		}
		_day += GetMonthDay(_year, _month);
	}
	return *this;
}


//日期-天数
Date Date::operator-(const int day) const
{
    
    
	Date d(*this);
	return d -= day;
}


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

//后置 ++
Date Date::operator++(int)
{
    
    
	//先用再加
	Date tem(*this);
	*this += 1;
	return tem;
}

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

//后置--
Date Date::operator--(int)
{
    
    
	Date tem(*this);
	*this -= 1;
	return tem;
}


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

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


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

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

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


bool Date::operator!=(const Date& d) const 
{
    
    
	return !(*this == d);
}


//打印日期
void Date::Print() const
{
    
    
	cout << _year << "-" << _month << "-" << _day << endl;
}


//日期减日期
int Date::operator-(const Date& d) const
{
    
    
	Date Max(*this);
	Date Min(d);
	int flag = 1;
	if (*this < d)
	{
    
    
		Max = d;
		Min = *this;
		flag = -1;
	}
	int day = 0;
	while (Min != Max)
	{
    
    
		++Min;
		++day;
	}
	return day * flag;
	
}

因为代码逻辑并不复杂,这里就不再赘述逻辑,请大家谅解。

猜你喜欢

转载自blog.csdn.net/weixin_45153969/article/details/132232531