日期類是很常用的乙個類,我們要模仿實現的就是日常生活中會用到的一些功能。
首先給出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語言中要在一串字串的尾部拼接另乙個字串,我們需要做的事情就是定義兩個字串,要使...