[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 << "(重载<=运算符)" << endl;
	else
		cout << date6 &

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

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

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

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

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

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

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