最近學習C++,試着寫C++的基本例題,發現一個問題,雖然代碼磕磕絆絆的寫出來了,也實現了函數功能,但是十分的臃腫,相似的功能需要重新寫一遍,不僅重複,可讀性差,而且也不便於管理,如下面這個例子,
是對兩個日期進行比較大小,重載日期與天數的加減以及兩日期的加計算差值,重載的符號有
++,--(前置),++,--(後置),+=,-=,<,>,== , != ,<=, >=
#include <iostream>
using namespace std;
class Date
{
public:
int GetMonthDay(int year, int month)//用來獲取當前月份的日期
{
int monthArray[13] = { 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 monthArray[month];
}
Date(int year = 2019, int month = 1, int day = 1)
{
if (year > 0
&&month > 0
&& month < 13
&&day > 0
&&day <= GetMonthDay(year, month))
{
_year = year;
_month = month;
_day = day;
}
// 四個成員函數
else
{
cout << "日期非法" << endl;
_year = 0;
_month = 0;
_day = 0 ;
}
}
print()
{
cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}
Date(Date &date)
{
_year = date._year;
_month= date._month;
_day = date._day;
}
}
先構建基本的類。
然後先實現最簡單的==判斷符
bool operator==(const Date& d)
{
if( d._year == _year
&&d._month== _month
&&d._day == _day)
return true;
else
return false;
};
類似的!=也可以寫
bool operator!=(const Date& d)
{
if( d._year != _year
||d._month!= _month
||d._day != _day)
return true;
else
return false;
};
重載>符號的思路是先比較高位再比較低位,如果都相同返回false
bool operator>(const Date& d)
{
if( _year > d._year)
{
return true;
}
if(_year == d._year)
{
if(_month>d._month)
return true;
}
if(_month == d._month)
{
if(_day>d._day)
return true;
}
return false;
}
重載<符號的思路也一樣,我開始寫的代碼如下
bool operator<(const Date& d)
{
if( _year < d._year)
{
return true;
}
if(_year == d._year)
{
if(_month<d._month)
return true;
}
if(_month == d._month)
{
if(_day<d._day)
return true;
}
return false;
};
但是這樣寫的代碼,和上面的相似,所以在已經重載>和==的基礎上,可以改成下
bool operator<(const Date& d)
{
return !((*this)>d);
}
;
不僅簡潔,而且可讀性強,但是美中不足的是會有函數調用時的壓棧的開銷,我們可以考慮改爲內聯函數
這種方法叫做函數的複用,具有擴展性較強,更安全更方便的特點,用壓棧實現,可以設置爲內聯函數提高效率。
根據這種思想我們可以先實現+
Date operator+(int day)
{
Date fru((*this));
fru._day += day;
while(fru._day>GetMonthDay( fru._year, fru._month))
{
if(fru._month==12)
{
fru._month = 0;
fru._year++;
}
fru._day -= GetMonthDay(fru._year, fru._month);
fru._month++;
}
return fru;
};
其他的符號通過函數複用+來實現
如 -
inline Date operator-(int day)
{
Date copy(*this);
day = -day;
return (copy+day);
}
其他++,--等實現思想相同,就不一一列舉出來了。
總結:函數複用就是在函數裏調用其他函數實現功能,具有簡潔,而且可讀性強,便於測試的特點