13.3 深度隔离的界面(Deeply Parted interface)
//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;
}

浙公网安备 33010602011771号