//13.3 深度隔离的界面(Deeply Parted interface)
//13.3.1 日期的年月日版本(Year-Month-Day of Date VER)
//例如,自定义的Date类原先是如下这样定义的
//测试一下
#include <iostream> #include "date_new.h" using namespace std; int main() { cout<<"I am Main"; Date_new data(2011,11,11); //cout<<(ostream& o, &data); std::cout<<data; data += 5; cout<<"加五天过后\n"; std::cout<<data; cout<<"++操作以后\n"; data++; std::cout<<data; //cout<<""; Date_new e(732006); std::cout<<e; int _day = data - e; cout<<"两个日期相差:"<<_day<<"天"; //e.print(); //e.print(); system("pause"); return 0; }
//日期的年月日版本类文件 #ifndef HEADER_DATE_NEW #define HEADER_DATA_NEW #include <iostream> class Date_new { int year, month, day; protected: //保护成员,只能在类类部使用,而不能在实例化外使用 int ymd2i()const; void i2ymd(int n); void print(std::ostream& o) const; //定义一个输入流的操作函数 static const int tians[]; //定义一个静态的常量int数组 //判断是否,如果是我的话,可能直接写成year%4==0 如果只要能整除四就行了 bool isLeapYear()const{ return !(year%4) && (year%100) || !(year%400); } public: Date_new(const std::string& s); Date_new(int n=1){ i2ymd(n); } Date_new(int y, int m, int d):year(y),month(m),day(d){} //重载运算符+号,返回值为实例一个Date_new(ymd2i()+n)的一个Date_new对像实体 Date_new operator+(int n)const{ return Date_new( ymd2i() + n);} //重载运算符+=号,返回一个Date_new的引用地址,在函数内直接返回自己*this Date_new& operator+=(int n){ i2ymd(ymd2i()+n); return *this; } //这里有点弄不懂,直接把*thsi+=1,*this是自己能直接+1吗 Date_new& operator++(){ return *this +=1; } //这里重载函数- int operator-(Date_new& d)const{ return ymd2i() - d.ymd2i(); } //这里定义一个友元的重载运算符<< friend std::ostream& operator<<(std::ostream& o, const Date_new& d); }; #endif
//日期的年月日版本的程序代码 #include "date_new.h" #include <iostream> #include <iomanip> using namespace std; //声明所定义的常量int型数组 //这里记录所有月份的天数 const int Date_new::tians[]={0,31,59,89,120,150,181,212,242,273,303,334}; //传入一个整型数 void Date_new::i2ymd(int absDay) { //定义absDay的数值有效性 absDay = absDay>0 && absDay<3650000 ? absDay : 1; int n = absDay; //这里是看传入的数值有多少年,初始循环year为1 //只要n大于isLeapYear()+365的值,那么就一直循环下去 //每循环一次将n的值减去isLeapYear()+365,并且年数加加 for(year=1; n>isLeapYear()+365; n-=isLeapYear()+365, year++); //这里month初始值为1, //循环条件为 month<12并且 n的天数大于isLeapYear&& month>2然后加上这个月的总天数 //然后月份加一 for(month=1; (month<12 && n>(isLeapYear() && month>2)+tians[month]); month++); //day的值为 //当前所余下的天数减去 isLeapYear() && 月份大于2 然后减去 当前月份减一的天数 day = n-(isLeapYear() && month>2)-tians[month-1]; //cout<<"year="<<year<<", month="<<month<<", day="<<day; } int Date_new::ymd2i()const{ //取得年的总天数 //year = 2011 //733650 + 502.5 - 20.1 + 5.025 //还是有点弄不懂样,似懂非懂 int absday = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400; //在加上当前月的天数和当前天的天数 return absday +=tians[month-1]+(isLeapYear() && month>2) + day; } //打印当前天月日 void Date_new::print(ostream& o)const{ o<<setfill('0')<<setw(4)<<year<<"-"<<setw(2)<<month<<"-"<<setw(2)<<day<<"\n"<<setfill(' '); } //重载运算符<< 第一个参数为ostream流,第二个参数为Date_new类型的一个引用 //这里是一个Date_new的友元函数 ostream& operator<<(ostream& o, const Date_new& d) { d.print(o); return o; }