c++實現一個日期類
阿新 • • 發佈:2018-12-22
#pragma once #include <iostream> using namespace std; class Date { private: int _year; int _month; int _day; int GetMonthDays(int year, int month)const;//獲取某個月的天數 public: Date() : _year(1900) , _month(1) , _day(1) { } Date(int year, int month, int day);// 建構函式 Date(const Date& d); // 拷貝建構函式 ~Date() { } // 解構函式 int GetYear()const; // 返回年份 int GetMonth()const; // 返回月份 int GetDay()const; // 返回天數 void Print()const; // 輸出日期 bool IsLeapYear()const; // 判斷當前物件年是否是閏年 bool IsLeapYear(const int y)const; // 判斷指定年份是否是閏年 // 操作符過載部分 // 天數 + 日期 friend Date operator+(const int d, const Date date); // 日期 + 天數 friend Date operator + (const Date date, const int d); // 前置 ++ friend Date& operator ++ (Date& date); // 後置 ++ 多一個int引數與前置區別 friend Date operator ++ (Date& date, int); // 過載 += friend Date operator +=(Date& date, const int d); // 日期 - 天數 friend Date operator - (const Date date, const int d); // 天數 - 日期 friend Date operator - (const int d, const Date date); // 前置 -- friend Date& operator -- (Date& date); // 後置 -- friend Date operator -- (Date& date, int); // 過載 -= friend Date operator -=(Date& date, const int d); // 日期 - 日期 friend int operator - (const Date a, const Date b); // 過載比較操作符 friend bool operator< (const Date a, const Date b); friend bool operator<= (const Date a, const Date b); friend bool operator> (const Date a, const Date b); friend bool operator>= (const Date a, const Date b); friend bool operator== (const Date a, const Date b); friend bool operator!= (const Date a, const Date b); // 過載輸出運算子 << friend ostream& operator <<(ostream& _out, const Date& date); // 過載輸入運算子 >> friend istream& operator >> (istream& _out, Date& date); };
#include "Date.h" //建構函式 Date::Date(int year = 1900,int month = 1, int day = 1) : _year(year) , _month(month) , _day(day) { //檢測年份月份天數的合法性 if ( year<= 0 || (month<=0 || month>12) || (day <= 0 || day>GetMonthDays(year, month)) ) { _year = 1900; _month = 1; _day = 1; } } //拷貝建構函式 Date::Date(const Date& d) { _year = d. _year; _month = d. _month; _day = d. _day; } //獲取某月中的天數 int Date::GetMonthDays(int year, int month)const { // a[1] - a[12] 表示非閏年每月天數 int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; // 二月份天數做特殊處理 平年28 閏年29天 if (month == 2) { a[2] += IsLeapYear(year); } return a[month]; } // 返回年份 int Date::GetYear()const { return _year; } // 返回月份 int Date::GetMonth()const { return _month; } // 返回天數 int Date::GetDay()const { return _day; } // 輸出日期 void Date::Print()const { cout << _year << " 年 " << _month << " 月 " << _day << " 日 " <<endl; } // 判斷當前年是否是閏年 bool Date::IsLeapYear()const { if ( _year%400 == 0 || ( _year%4==0 && _year%100!=0)) { return true; } return false; } // 判斷指定年份是否是閏年 bool Date::IsLeapYear(const int year)const { if (year%400 == 0 || (year%4==0 && year%100!=0)) { return true; } return false; } // 操作符過載部分 // 天數 + 日期 Date operator+(const int d, const Date date) { Date tmpDate = date; if (0 == d) return date; // 加的天數為0 返回本身的值 // 獲取當前物件對應月份的天數 int days; if (d > 0) { tmpDate. _day += d; while (tmpDate. _day > (days = tmpDate.GetMonthDays(tmpDate. _year, tmpDate. _month))) //加天數後對不合理值處理 { //2010.3.12 + 30 2012.3.42 > 31 2012.4.42 - 31 //減去該月的天數 tmpDate. _day -= days; tmpDate. _month ++; // 月份增加一個月 if (tmpDate. _month > 12) //處理月份不合理 { tmpDate. _year ++; tmpDate. _month = 1; //超過12後年份++ 月份置1 } } } else { return date - (0 - d); } return tmpDate; } // 日期 + 天數 Date operator + (const Date date, const int d) { return d + date; } // 前置 ++ Date& operator ++ (Date& date) { date = date + 1; return date; } // 後置 ++ 多一個int引數與前置區別 Date operator ++ (Date& date, int) { Date temp = date; date = date + 1; return temp; } // 過載 += Date operator +=(Date& date, const int d) { date = date + d; return date; } // 日期 - 天數 Date operator - (const Date date, const int d) { Date tempDate = date; if (0 == d) return date; if ( d>0 ) { tempDate. _day -= d; while (tempDate. _day <= 0) { --tempDate. _month; if (tempDate. _month == 0) { --tempDate. _year; tempDate. _month = 12; } tempDate. _day += tempDate.GetMonthDays(tempDate. _year, tempDate. _month); } } else { return date + ( - d); } return tempDate; } // 天數 - 日期 Date operator - (const int d, const Date date) { return date - d; } // 前置 -- Date& operator -- (Date& date) { date = date - 1; return date; } // 後置 -- Date operator -- (Date& date, int) { Date temp = date; date = date - 1; return temp; } // 過載 -= Date operator -=(Date& date, const int d) { date = date - d; return date; } // 日期 - 日期 int operator - (const Date a, const Date b) { int sumDay = 0; if (a==b) { return 0; } else if(a>b) { Date temp = b; while (temp!=a) { temp++; sumDay++; } } else // a<b { Date temp = a; while (temp!=b) { temp++; sumDay++; } } return sumDay; // 2016.1.1 - 2015.12.20 } //過載比較操作符部分 // 判相等 bool operator== (const Date a, const Date b) { // 同年同月同日 return (a. _year == b. _year && a. _month == b. _month && a. _day == b. _day); } // 判不等 bool operator!= (const Date a, const Date b) { // 對判相等取反即可 a和b相等時 取反 不相等判斷為假 return !(a==b); } // 判小於 bool operator< (const Date a, const Date b) { //先處理不小於 2016 10 29 2016 10 29 同年看月 同年同月看日 if (a. _year > b. _year|| (a. _year == b. _year && a. _month > b. _month)|| (a. _year == b. _year && a. _month == b. _month && a. _day >= b. _day) ) { return false; } return true; } // 判小於等於 bool operator<= (const Date a, const Date b) { if (a<b ||a==b) { return true; } return false; } // 判大於 bool operator> (const Date a, const Date b) { return !(a<=b); } // 判大於等於 bool operator>= (const Date a, const Date b) { if (a>b || a==b) { return true; } return false; } // 過載輸出運算子 << std::ostream& operator<<(ostream& _out, const Date& date) { _out << date.GetYear() << " 年 " << date.GetMonth() << " 月 " << date.GetDay() << " 日 " <<endl; return _out; } // 過載輸入運算子 << std::istream& operator >> (istream& _input, Date& date) { int year = 0,month = 0,day = 0; cin >> year >> month >> day; Date temp(year,month,day); date = temp; return _input; }
#include "Date.h" int main() { Date d1; d1.Print(); cout<<"1.對日期++或--:"<<endl; Date d2(2016, 10 , 1); d2.Print(); ++d2; d2.Print(); --d2; d2.Print(); d2--; d2.Print(); d2++; d2.Print(); cout <<" 2.對日期+=和-=和對日期減一個天數"<< endl; Date d3(2016,1,1); d3.Print(); d3 += 10; d3.Print(); d3 -= 10; d3.Print(); d3 = d3 - 3; d3.Print(); bool state; cout<<"3.兩日期比較"<<endl; Date d4(2016,10,9); Date d5(2016,10,10); state = d4<d5; cout << state << endl; cout<<"4.兩日期相減"<<endl; Date d6(2008,4,1); Date d7(2016,1,1); cout << d6 - d7<<endl; cout << d7 - d6 << endl; return 0; }