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

      

  • 相关阅读:
    使用VisualStudio进行单元测试之二
    使用VisualStudio进行单元测试之一
    ExtJS监听键盘事件:回车键实现登录功能
    PPTP无法连网
    Android深度探索.
    Android深度探索
    Android驱动开发
    window.open()的具体使用方法
    js控制的几种页面跳转和传值(转载)
    Hatching shader
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2350111.html
Copyright © 2020-2023  润新知