臃肿代码的简化:C++

 最近学习C++,试着写C++的基本例题,发现一个问题,虽然代码磕磕绊绊的写出来了,也实现了函数功能,但是十分的臃肿,相似的功能需要重新写一遍,不仅重复,可读性差,而且也不便于管理,如下面这个例子,

是对两个日期进行比较大小,重载日期与天数的加减以及两日期的加计算差值,重载的符号有

++,--(前置),++,--(后置),+=,-=,<,>,== , != ,<=, >=


#include 
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<

先构建基本的类。

然后先实现最简单的==判断符

bool operator==(const Date& d)
{if( d._year == _year&&d._month== _month&&d._day  == _day)return true;elsereturn false;};

类似的!=也可以写

bool operator!=(const Date& d)
{if( d._year != _year||d._month!= _month||d._day  != _day)return true;elsereturn 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

但是这样写的代码,和上面的相似,所以在已经重载>和==的基础上,可以改成下

 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);
}

其他++,--等实现思想相同,就不一一列举出来了。

总结:函数复用就是在函数里调用其他函数实现功能,具有简洁,而且可读性强,便于测试的特点

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章