臃腫代碼的簡化:C++

 最近學習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);
}

其他++,--等實現思想相同,就不一一列舉出來了。

總結:函數複用就是在函數裏調用其他函數實現功能,具有簡潔,而且可讀性強,便於測試的特點

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章