在設(shè)計(jì)一個(gè)Date類的時(shí)候,我們使用int類型來(lái)表示年份,如果我們需要對(duì)年份進(jìn)行一些特殊的操作(如:檢查,保護(hù)等),就很需要定義一個(gè)Year類,如下:
class Year {
int m_y;
public:
//explicit限制int到Y(jié)ear的隱式轉(zhuǎn)換
explicit Year(int y)
: y(m_y) { }
//Year到int的類型轉(zhuǎn)換
operator int() const
{ return m_y; }
//other funtion
}
class Date {
public :
Date(int d, Month m, Year y);
//
};
Date d1(1987, feb, 21); //error, 21不能隱式轉(zhuǎn)換為Year
Date d2(21, feb, Year(1987)); //ok
在這里Year就只是包裹住了int,對(duì)int提供一層保護(hù)而已。由于operator int()的存在,只要需要,Year可以隱式的轉(zhuǎn)化為int出現(xiàn)運(yùn)算表達(dá)式中參加運(yùn)算。而通過(guò)給構(gòu)造函數(shù)聲明為explicit,就能夠保證,int到Y(jié)ear的轉(zhuǎn)化只能在明確無(wú)誤的情況進(jìn)行,避免了意外的賦值。
顯示構(gòu)造函數(shù)和轉(zhuǎn)換運(yùn)算符的合作,讓Year可以當(dāng)int使用,同時(shí)又對(duì)Year進(jìn)行一定的保護(hù)。。。