[C++]——日期类运算符的重载(针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序)

Posted FortunateJA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++]——日期类运算符的重载(针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序)相关的知识,希望对你有一定的参考价值。

前言

内容:
针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序。

要求:

  1. 掌握类的定义和使用方法,掌握类对象的声明和使用方法。
  2. 掌握对象的初始化和赋值的方法。
  3. 了解成员函数的特性、友元。
  4. 掌握静态成员的使用方法。
  5. 理解和掌握this指针的用法。
  6. 理解和掌握const类型数据的使用。

Date.h

#ifndef DATE_H
#define DATE_H

class Date
{
public:					
	friend ostream& operator<<(ostream& output, Date& d);//运算符重载 
	friend istream& operator>>(istream& input, Date& d);//运算符重载 

	//Date(); 
	Date(int = 1900, int = 1, int = 1);
	Date(const Date &);//拷贝构造函数 
	~Date();//析构函数 

	void  setDate(int, int, int); //对输入日期做有效性验证
	inline int getYear() const;
	inline int getMonth() const;//显示定义内联函数 
	inline int getDay() const;

	void displayDate() const;
	Date* addOneDay();
	bool isLeapYear();

	bool operator==(Date &);//运算符重载 
	bool operator!=(Date &);
	bool operator>(Date &);
	bool operator<(Date &);
	bool operator<=(Date &);
	bool operator>=(Date &);
	Date& operator++(); //前置 
	Date operator++(int);//后置 

	void Sort(Date date[6]);

private:
	int year, month, day;
};
#endif

Date.cpp

#include <iostream>
using namespace std;
#include "Date.h"
//运算符重载函数实现 
ostream& operator<<(ostream& output, Date& d)
{
	output << d.year << "/" << d.month << "/" << d.day;
	return output;
}

istream& operator>>(istream& input, Date& d)
{
	cout << "请输入年份:";
	while (1)
	{
		input >> d.year;
		if (d.year >= 1900)
			break;
		else
			cout << "错误,请从新输入:";
	}
	cout << "请输入月份:";
	while (1)
	{
		input >> d.month;
		if (d.month>0 && d.month<13)
			break;
		else
			cout << "错误,请从新输入:";
	}
	cout << "请输入日:";
	input >> d.day;
	return input;

}

Date::Date(int y, int m, int d){
	setDate(y, m, d);
}

Date::Date(const Date &d){
	year = d.year;
	month = d.month;
	day = d.day;
}

Date::~Date(){
}
void  Date::setDate(int y, int m, int d){
	while (1)//验证年 
	{
		if (y<1900){
			cout << "please input the year(>=1900) again:" << endl;
			cin >> y;
		}
		else{
			year = y;
			break;
		}
	}
	while (1)//验证月 
	{
		if (m<1 || m>12){
			cout << "please input the month(1=<month<=12) again:" << endl;
			cin >> m;
		}
		else{
			month = m;
			break;
		}
	}
	while (1)//验证日期 
	{
		if ((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12)){
			if (d<1 || d>31){
				cout << "please input the day(1=<day<=31) again:" << endl;
				cin >> d;
			}
			else{
				day = d;
				break;
			}
		}
		if ((m == 4) || (m == 6) || (m == 9) || (m == 11)){
			if (d<1 || d>30){
				cout << "please input the day(1=<day<=30) again:" << endl;
				cin >> d;
			}
			else{
				day = d;
				break;
			}
		}
		if (m == 2){
			if (isLeapYear()){
				if (d<1 || d>29){
					cout << "please input the day(1=<day<=29) again:" << endl;
					cin >> d;
				}
				else{
					day = d;
					break;
				}
			}
			else {
				if (d<1 || d>28){
					cout << "please input the day(1=<day<=29) again:" << endl;
					cin >> d;
				}
				else{
					day = d;
					break;
				}
			}
		}
	}
}
inline int Date::getYear()const {
	return year;
}

inline int Date::getMonth()const{
	return month;
}

inline int Date::getDay()const{
	return day;
}


void Date::displayDate()const{
	cout << getYear() << "/" << getMonth() << "/" << getDay() << endl;
}

Date* Date::addOneDay(){
	switch (month)
	{
	case 2:
		if (isLeapYear()){
			if (day<29)
				day++;
			else{
				day = 1;
				month++;
			}
		}
		else{
			if (day<28)
				day++;
			else{
				day = 1;
				month++;
			}
		}
		break;
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
		if (day>30){
			day = 1;
			month++;
		}
		else
			day++;
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		if (day>29){
			day = 1;
			month++;
		}
		else
			day++;
		break;
	case 12:
		if (day>30){
			day = 1;
			month = 1;
			year++;
		}
		else
			day++;
		break;
	default: cout << "ERROR" << endl;
	}
	return this;
}

bool Date::isLeapYear(){
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		return true;
	else
		return false;
}


bool Date::operator==(Date& d)
{
	return (this->year == d.year) && (this->month == d.month) && (this->day == d.day);
}


bool Date::operator!=(Date& d)
{
	return (this->year != d.year) || (this->month != d.month) || (this->day != d.day);
}

bool Date::operator>(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;
		}
	}
	return false;
}

bool Date::operator<(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;
		}
	}
	return false;
}


bool Date::operator<=(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;
		}
	}
	return false;
}


bool Date::operator>=(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 if (day<d.day)
				return false;
		}
	}
	return false;
}


Date& Date::operator++()
{
	addOneDay();
	return *this;
}

Date Date::operator++(int)
{
	Date temp = *this;
	addOneDay();
	//cout<<"测试:"<<temp<<"  "<<*this<<endl;
	return temp;
}

void Date::Sort(Date date[6])
{
	int i, j;
	Date temp(1900, 1, 1);
	for (i = 0; i<6; i++)
	{
		for (j = 0; j<6; j++)
		{
			if (date[j]<date[j + 1])
			{
				temp = date[j];
				date[j] = date[j + 1];
				date[j + 1] = temp;
			}
		}
	}
}


main函数

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

void Sort(Date date1, Date date2, Date date3, Date date4, Date date5, Date date6)
{
	int i, j;
	Date date[6] = { date1, date2, date3, date4, date5, date6 };
	Date temp;
	for (i = 0; i<6; i++)
	{
		for (j = 0; j<6 - i; j++)
		{

			if (date[j]<date[j + 1])
			{
				temp = date[j];
				date[j] = date[j + 1];
				date[j + 1] = temp;
			}
		}
		cout << date[i] << " ";
	}
}

int main() {
	Date date1(2020, 4, 10);
	cout << "date1:" << date1 << endl;

	Date *date2 = date1.addOneDay();
	cout << "date2:" << *date2 << endl;

	Date date3(2000, 1, 9);
	cout << "date3:" << date3 << endl;

	Date date4(2000, 3, 1);
	cout << "date4:" << date4 << endl;

	Date date5(1999, 12, 31);
	cout << "date5:" << date5 << endl;

	Date date6(1900, 12, 1);
	cout << "date6:" << date6 << endl;

	if (date1 == date3)
		cout << endl << "两日期相等(重载==运算符)" << endl;
	else
		cout << "两日期不相等(重载==运算符)" << endl;

	if (date4 != date3)
		cout << "两日期不相等(重载!=运算符)" << endl;
	else
		cout << "两日期相等(重载!=运算符)" << endl;

	if (date4 >= date3)
		cout << date4 << ">=" << date3 << "(重载>=运算符)" << endl;
	else
		cout << date4 << "<" << date3 << "(重载>=运算符)" << endl;

	if (date6 <= date3)
		cout << date6 << "<=" << date3 << "(重载<=运算符)" 以上是关于[C++]——日期类运算符的重载(针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序)的主要内容,如果未能解决你的问题,请参考以下文章

[C++] 类与对象(中) 一篇带你解决运算符重载实例--日期类Date

[ C++ ] 类与对象(下)日期类Date补充及流提取和流插入运算符重载

C++类和对象 - 日期类的实现

C++类和对象 - 日期类的实现

C++类和对象 - 日期类的实现

[ C++ ] C++类与对象(中) 类中6个默认成员函数 -- 运算符重载