模擬實現Date類

2021-09-02 01:59:18 字數 4230 閱讀 4206

日期類是很常用的乙個類,我們要模仿實現的就是日常生活中會用到的一些功能。

首先給出date類的標頭檔案:

class date

;

下面我們來一一實現它們:

//建構函式

//使用初始化引數列表,為成員變數一一賦值即可。

//當初始化完成後,用assert語句判斷成員變數的合法性。

//如果不合法,返回異常。

date::date(int year, int month, int day)

:_year(year)

,_month(month)

,_day(day)

//析構函式

//將成員變數賦值為0

date::~date()

//拷貝建構函式

//這裡的形參只能用引用型別。

//如果直接用的是物件型別,那麼就會在傳參的時候建立乙個形參d,

//而d是用實參拷貝構造的,這樣就會一直迴圈下去。

date::date(const date& d)

:_year(d._year)

,_month(d._month)

,_day(d._day)

{}//返回年份

int date::getyear() const

//返回月份

int date::getmonth() const

//返回日期

int date::getday() const

//賦值運算子過載

//當 d 不是當前物件時,將d的成員變數的值,依次賦給當前物件的成員變數。

//並且返回當前物件的引用。

//由於這裡當前物件的生命週期比函式長,因此可以直接返回當前物件的引用。

//省去了建立臨時變數返回的步驟,提高了效率。

date& date::operator=(const date& d)

return *this;

}//判斷年份是否是閏年

//在date類外,判斷是否是閏年,可以由使用者自行判斷。

//這裡的作用是為了輔助實現其他功能,因此直接定義為私有,對外不可見。

bool date::isleapyear() const

//判斷日期的合法性

//用來檢測日期的合法性,確保日期是正確的。

//需要注意的就只有,當是閏年時,二月日期為29天。否則,為28天。

int date::getdayinmonth() const

; if (this->isleapyear())

return daynumber[this->_month - 1];

}//+運算子過載

//實現的原理為:

//先將days全部加在成員變數_day上面,

//用.getdayinmonth()函式判斷日期的合法性,

//當日期不正確時,從_day中減去本月的天數,將月份增加一月,

//一直迴圈,直到日期合法時,跳出迴圈,並且將計算完的物件返回。

//可以理解為:傳進來乙個總天數days,從當前日期往前走,每走乙個月,那麼從總日期中減去這個月的天數。

//然後所處的月份加一,然後從新的一月的第一天開始走。如果走完了一年,那麼月份變為一月,年份加一。

//因為 + 運算子並不會 影響當前物件本身,所以因該將結果儲存在臨時物件中,

//又因為臨時物件是建立在棧上的,所以函式執行完之後會銷毀,

//因此不能返回引用,所以返回的是建立的臨時物件的值。

date date::operator+(int days) const

temp._day += days;

while(temp._day > temp.getdayinmonth())

}return temp;

}//+=運算子過載

//+=運算子會影響當前物件,所以直接在函式中,將 + 運算子計算的結果賦值給當前物件

//然後返回引用即可

date& date::operator+=(int days)

//-運算子過載

//原理同上面+運算子,只是日期是倒著走

//實現的原理為:

//先用成員變數_day減去days

//當_day < 1 時,說明日期不合法。

//當日期不合法時,將月份減少一月,給_day加上上月的天數,說明往前退了乙個月。

//一直迴圈,直到日期合法時,跳出迴圈,並且將計算完的物件返回。

//需要注意的是,在計算的時候,由於是往前退乙個月,所以應該是先減去月份,再加上月份對應的日期,

//或者是先加上上月的日期,然後再減去月份。

date date::operator-(int days) const

temp._day -= days;

while(temp._day < 1)

temp._day += temp.getdayinmonth();

}return temp;

}//-=運算子過載

//原來相同,不做過多解釋

date& date::operator-=(int days)

//&運算子過載

date* date::operator&()

//&運算子過載 針對const 物件

const date* date::operator&() const

//《運算子過載

//我們都知道,類的成員函式第乙個引數為隱含的 this 指標。

//那麼對於 << 運算子如果直接過載,過載後,cout輸出流就變為了第二個引數,

//而預設的 << 中,cout輸出流應該為第乙個引數,

//如果使用 cout << a 的形式呼叫,結果肯定是不對的。

//所以我們在類外進行操作符過載,然後定義為類的友元函式即可

std::ostream& operator<<(std::ostream& _cout, const date& d)

//>>運算子過載

std::istream& operator>>(std::istream& _cin, date& d)

//前置++運算子過載

//只需要對當前物件 + 1 然後返回當前物件即可

date& date::operator++()

//後置++運算子過載

//函式中形參僅僅是用於與前置++構成過載

//後置++ 是 執行完當前語句後才進行++操作,

//所以我們應該先將當前物件儲存起來,等當前物件++完成之後,

//再返回之前儲存的值,返回值不返回引用的原因為:

//臨時變數為棧上元素,函式結束後,會銷毀掉

date date::operator++(int)

//前置--運算子過載

date& date::operator--()

//後置++運算子過載

date date::operator--(int)

//-運算子過載

//用兩個臨時物件maxxdate 和 mindate 分別儲存 d 和 當前物件中的 大日期 和 小日期

//寫乙個迴圈,讓小日期加乙個天數 當兩個日期相等時,返回加的日期即可。

int date::operator-(const date& d) const

mindate = (*this) < d ? (*this) : d;

maxdate = (*this) > d ? (*this) : d;

while(1)

++ret;

}return ret;

}//>運算子過載

//只需要判斷對應成員變數的大小即可

bool date::operator>(const date& d) const

//>=運算子過載

bool date::operator>=(const date& d) const

//>運算子過載

bool date::operator<(const date& d) const

//>=運算子過載

bool date::operator<=(const date& d) const

//==運算子過載

bool date::operator==(const date& d) const

//!=運算子過載

bool date::operator!=(const date& d) const

模擬實現string類

include using namespace std include class string string string a 2 為什麼要用 優點在哪 string void print string operator const string a string operator const s...

模擬實現日期類

日期類好久沒寫了,重溫一下以前的知識。寫日期類需要注意的有 1 日期減日期的計算 2 關於輸出輸入過載的友元函式宣告 3 建構函式的條件判斷 4 拷貝建構函式的自我賦值判斷 實現 如下 include using namespace std class date else 拷貝建構函式 date c...

模擬實現string類

在c 中,string其實就是將字串封裝起來的類,呼叫類中的成員函式可以完成對類內的字串進行增刪查改,並且將操作符過載,可以更直觀的操作字串,省去了c語言中很多麻煩的操作,有現成的成員函式供我們使用。舉乙個簡單的例子 在c語言中要在一串字串的尾部拼接另乙個字串,我們需要做的事情就是定義兩個字串,要使...