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

  

原文地址:https://www.cnblogs.com/xiangxiaodong/p/2350111.html