[C++]——日期类运算符的重载(针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序)
Posted FortunateJA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++]——日期类运算符的重载(针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序)相关的知识,希望对你有一定的参考价值。
前言
内容:
针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序。
要求:
- 掌握类的定义和使用方法,掌握类对象的声明和使用方法。
- 掌握对象的初始化和赋值的方法。
- 了解成员函数的特性、友元。
- 掌握静态成员的使用方法。
- 理解和掌握this指针的用法。
- 理解和掌握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