C++無痛實現(xiàn)日期類的示例代碼
日期類的實現(xiàn)
凡是要寫類必須要提到六大默認(rèn)成員(六位大爺):構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值重載函數(shù)、取地址重載函數(shù)(包括const對象和普通對象);那么這次的日期類又需要伺候哪幾位大爺呢?
日期類的實現(xiàn)中函數(shù)與函數(shù)之間有較強的耦合性,所以實現(xiàn)的邏輯順序一定要把握好,不然會暈頭轉(zhuǎn)向的?。?! 下面是我的實現(xiàn)順序:
構(gòu)造函數(shù)
Date(const Date& d)//拷貝構(gòu)造函數(shù)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
析構(gòu)函數(shù)
~Date()//析構(gòu)函數(shù)
{
_year = 1;
_month = 1;
_day = 1;
}
拷貝構(gòu)造函數(shù)
Date(const Date& d)//拷貝構(gòu)造函數(shù)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
打印函數(shù)
void Print()//打印函數(shù)
{
cout << _year << "-" << _month << "-" << _day << endl;
}
這里我們還需要寫一個獲取月份對應(yīng)天數(shù)的函數(shù)
獲取天數(shù)函數(shù)
int GetTrueDay(int year, int month)//得到正確月份天數(shù)
{
static int monthday[] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
if (month == 2 && ((year % 4 == 0 && year % 100 != 0)
|| (year % 400 == 0)))
{
return 29;
}
else
{
return monthday[month];
}
}
這里就是大體框架了,接下來是各個細(xì)節(jié)部分
運算符重載區(qū)
判斷兩個日期是否相等(*this==d)
bool operator==(const Date& d) const;//等于 //---相等為真(返回1);不相同為假(返回0)
bool Date:: operator==(const Date& d) const//等于
{//年相等才判斷到月,月相等才判斷到年
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
判斷前一個日期是否大于后一個日期(*this>d)
bool operator>(const Date& d) const;//大于 //---相等為真(返回1);不相同為假(返回0)
bool Date:: operator>(const Date& d) const//大于
{//這里一樣的判斷順序依次是年---月---日
if (_year > d._year)
{
return true;
}
else if (_month > d._month)
{
return true;
}
else if (_day == d._day)
{
return true;
}
else
{
return false;
}
//大于
}判斷前一個日期是否大于等于后一個日期(*this>=d)
這里直接重載?。?!
bool operator>=(const Date& d) const//大于等于
{
return *this > d || *this == d;
}
判斷前一個日期是否小于后一個日期(*this<d)
這里直接重載?。。?/p>
bool operator<(const Date& d)const //判斷小于
{
return !(*this >= d);
}
判斷前一個日期是否小于等于后一個日期(*this<=d)
這里直接重載?。?!
bool operator<=(const Date& d)const//小于等于
{
return !(*this > d);
}
賦值重載
前一個日期等于后一個日期(*this=d)—可以連續(xù)賦值
Date& operator=(const Date& d)//賦值重載
{
if (this!=&d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
else
{
return*this;
}
}
對日期減天數(shù)-不影響自身-用拷貝構(gòu)造
Date operator-(int day) const;//減天數(shù)
Date Date:: operator-(int day) const//減天數(shù)-不影響本身-不用引用-用拷貝構(gòu)造函數(shù)
{
Date tmp(*this);
tmp-= day;
return tmp;
}
對日期加天數(shù)-不影響自身-用拷貝構(gòu)造
Date operator+(int day) const;//加天數(shù)
Date Date:: operator+(int day) const//加天數(shù)-不影響本身-不用引用-用拷貝構(gòu)造函數(shù)
{
Date tmp(*this);
tmp+= day;
return tmp;
}
日期減等天數(shù)-影響自身-用引用
Date& operator-=(int day) ;//減等天數(shù)
Date& Date:: operator-=(int day) //減等天數(shù)- 影響本身-用引用-不加const
{
if (day < 0)
{
return *this += abs(day);
}
_day -= day;
while (_day<=0)
{
--_month;
if (_month == 0)
{
--_year;
_month = 12;
}
_day += GetTrueDay(_year, _month);
}
return *this;
}日期加等天數(shù)-影響自身-用引用
Date& operator+=(int day);//加天數(shù)
Date& Date:: operator+=(int day) //加天數(shù)- 影響本身-用引用-不加const
{
if (day < 0)
{
return *this -= abs(day);
}
_day += day;
while (_day > GetTrueDay(_year, _month))
{
_day -= GetTrueDay(_year,_month);
_month++;
if (_month == 13)
{
_year++;
_month = 1;
}
}
return *this;
}日期天數(shù)前置++【影響自身(自增)-用引用-不加const】
Date& operator++(); //天數(shù)前置++
Date& Date::operator++()//前置++-改變自身-用引用
{
return *this += 1;
}
日期天數(shù)后置++【不影響自身-用拷貝構(gòu)造】
Date operator++(int);//后置++
Date Date::operator++(int)//后置++-不改變自身-用拷貝函數(shù)-括號里+int
{
Date tmp(*this);
*this += 1;
return tmp;
}
日期天數(shù)前置–【影響自身(自減)-用引用-不加const】
Date& operator--();//前置--
Date& Date::operator--()//前置-- --需要改變自身-用引用
{
return *this -= 1;
}
日期天數(shù)后置–【不影響自身-用拷貝構(gòu)造】
Date operator--(int);//后置--
Date Date::operator--(int)//后置--,不需要改變自身-用構(gòu)造函數(shù)-括號里+int
{
Date tmp(*this);
*this -= 1;
return tmp;
}
日期減日期(前一個日期減后一個日期-算差距天數(shù))
int operator-(const Date& d)const;//日期減日期-算差距天數(shù)
int Date:: operator-(const Date& d) const//日期減日期-算差距天數(shù)-都不改變自身+const
{
Date max = *this;
Date min=d;
int flag = 1;
if (*this<d)
{
max = d;
min = *this;
flag = -1;//如果*this比d小則減出來是負(fù)數(shù),所以要預(yù)備flag=-1
}
int n = 0;
while (min < max)//min++,max--,最后相等時,n++得出的就是差距天數(shù)
{
n++;
min++;
}
return flag * n;//*this比d小,得出來是負(fù)數(shù)-乘-1,*this比d大,得正數(shù)-乘1
}
流插入函數(shù)
friend ostream& operator<<(ostream& out, Date& d);//流插入友元聲明
ostream& operator<<(ostream& out, Date& d)//流插入
{
cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
return cout;
}
流提取函數(shù)
friend istream& operator>>(istream& in, Date& d);//流提取友元聲明
istream& operator>>(istream& in, Date& d)//流提取
{
in>> d._year;
in >> d._month;
in >> d._day;
return in;
}
好啦,以上就是日期類實現(xiàn)各個模塊啦,下面是整體代碼!
整體代碼
Date.h
#pragma once
#include<iostream>
using namespace std;
class Date
{
public:
Date(const Date& d)//拷貝構(gòu)造函數(shù)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
~Date()//析構(gòu)函數(shù)
{
_year = 1;
_month = 1;
_day = 1;
}
void Print()//打印函數(shù)
{
cout << _year << "-" << _month << "-" << _day << endl;
}
int GetTrueDay(int year, int month)//得到正確月份天數(shù)
{
static int monthday[] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
{
return 29;
}
else
{
return monthday[month];
}
}
Date(int year = 1, int month = 1, int day = 1)//構(gòu)造函數(shù)
: _year(year)
, _month(month)
, _day(day)
{
}
bool operator==(const Date& d) const;//等于
bool operator>(const Date& d) const;//大于
bool operator>=(const Date& d) const//大于等于
{
return *this > d || *this == d;
}
bool operator<(const Date& d)const //判斷小于
{
return !(*this >= d);
}
bool operator<=(const Date& d)const//小于等于
{
return !(*this > d);
}
Date& operator=(const Date& d)//賦值重載
{
if (this!=&d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
else
{
return*this;
}
}
Date operator-(int day) const;//減天數(shù)
Date operator+(int day) const;//加天數(shù)
Date& operator-=(int day) ;//減等天數(shù)
Date& operator+=(int day);//加天數(shù)
Date& operator++(); //天數(shù)前置++
Date operator++(int);//后置++
Date& operator--();//前置--
Date operator--(int);//后置--
int operator-(const Date& d)const;//日期減日期-算差距天數(shù)
friend ostream& operator<<(ostream& out, Date& d);//流插入友元聲明
friend istream& operator>>(istream& in, Date& d);//流提取友元聲明
private:
int _year;
int _month;
int _day;
};
Date.cpp
#include"Date.h"
bool Date:: operator==(const Date& d) const//等于
{
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
bool Date:: operator>(const Date& d) const//大于
{
if (_year > d._year)
{
return true;
}
else if (_month > d._month)
{
return true;
}
else if (_day == d._day)
{
return true;
}
else
{
return false;
}
}
Date Date:: operator-(int day) const//減天數(shù)-不影響本身-不用引用-用拷貝函數(shù)
{
Date tmp(*this);
tmp-= day;
return tmp;
}
Date Date:: operator+(int day) const//加天數(shù)-不影響本身-不用引用-用拷貝函數(shù)
{
Date tmp(*this);
tmp+= day;
return tmp;
}
Date& Date:: operator-=(int day) //減等天數(shù)- 影響本身-用引用-不加const
{
if (day < 0)
{
return *this += abs(day);
}
_day -= day;
while (_day<=0)
{
--_month;
if (_month == 0)
{
--_year;
_month = 12;
}
_day += GetTrueDay(_year, _month);
}
return *this;
}
Date& Date:: operator+=(int day) //加天數(shù)- 影響本身-用引用-不加const
{
if (day < 0)
{
return *this -= abs(day);
}
_day += day;
while (_day > GetTrueDay(_year, _month))
{
_day -= GetTrueDay(_year,_month);
_month++;
if (_month == 13)
{
_year++;
_month = 1;
}
}
return *this;
}
Date& Date::operator++()//前置++-改變自身-用引用
{
return *this += 1;
}
Date Date::operator++(int)//后置++-不改變自身-用拷貝函數(shù)-括號里+int
{
Date tmp(*this);
*this += 1;
return tmp;
}
Date& Date::operator--()//前置-- --需要改變自身-用引用
{
return *this -= 1;
}
Date Date::operator--(int)//后置--,不需要改變自身-用構(gòu)造函數(shù)-括號里+int
{
Date tmp(*this);
*this -= 1;
return tmp;
}
int Date:: operator-(const Date& d) const//日期減日期-算差距天數(shù)-都不改變自身+const
{
Date max = *this;
Date min=d;
int flag = 1;
if (*this<d)
{
max = d;
min = *this;
flag = -1;//如果*this比d小則減出來是負(fù)數(shù),所以要預(yù)備flag=-1
}
int n = 0;
while (min < max)
{
n++;
min++;
}
return flag * n;//*this比d小,得出來是負(fù)數(shù)-乘-1,比大,乘1
}
ostream& operator<<(ostream& out, Date& d)//流插入
{
cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
return cout;
}
istream& operator>>(istream& in, Date& d)//流提取
{
in>> d._year;
in >> d._month;
in >> d._day;
return in;
}
以上就是C++無痛實現(xiàn)日期類的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++日期類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實現(xiàn)一個線程安全的單例工廠實現(xiàn)代碼
這篇文章主要介紹了 C++實現(xiàn)一個線程安全的單例工廠實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲
本文主要介紹了VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲,實現(xiàn)了視頻,拍照,保存這三個功能。具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05
C++ EasyX學(xué)習(xí)之鼠標(biāo)操作詳解
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將為大家詳細(xì)講講EasyX的鼠標(biāo)操作,需要的可以參考一下2022-07-07
C++實現(xiàn)完整功能的通訊錄管理系統(tǒng)詳解
來了來了,通訊錄管理系統(tǒng)踏著七彩祥云飛來了,結(jié)合前面的結(jié)構(gòu)體知識和分文件編寫方法,我總結(jié)并碼了一個帶菜單的通訊錄管理系統(tǒng),在這篇文章中將會提到C的清空屏幕函數(shù),嵌套結(jié)構(gòu)體具體實現(xiàn),簡單且充實,跟著我的思路,可以很清晰的解決這個項目2022-05-05
C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10

