【2016.4.1】CDate类相关注记

编写一个日期类CDate,使得能够设置日期、显示日期、实现前置自增后置自增的重载函数。

该类的框架定义如下:

class CDate  
{  
private:  
    int year, month, day;      //年月日     
    static const int days[12]; //定义月份的天数,默认是闰年,用法:day=days[month-1]  
public:  
    CDate(int Y = 2016, int M = 1, int D = 1);//带有默认值的构造函数  
    ~CDate() {}                    //析构函数  
    bool set(int Y = 2016, int M = 1, int D = 1);  //带有默认值的设置日期函数,如果日期异常,则返回false  
    static bool is_leap_year(int Year){return ((Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0));}  //返回是否是闰年  
    CDate& operator++();   // ++a //前置后置自重载函数实现  
    CDate operator++(int); //a++  
    friend ostream& operator<<(ostream& out, const CDate& variable);//定义提取运算符重载  
}; 
其中有几点需要注意:

1.类中常量实现办法

static const int days[12];	//定义月份的天数,默认是闰年,用法:day=days[month-1]
这一个数组是用来保存常量值的,也就是12个月份的天数。要将 其定义为static静态类型的常数组,需要注意 此时不能被初始化,因为类只是一个声明,没有开辟空间。其 初始化要在实现文件中或类外定义方法的文件中实现不加static但是要加域名

const int CDate::days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
注意此时不要带static。

关于类中定义常量还有以下两个常用方法:

a.)使用枚举类型。如在类中定义:

class CDate
{
public:
enum days={january=31,february=28}//....etc
} 
b.)使用指针。在类中定义常量指针,在类外定义常数组,然后在构造函数中将数组地址赋值给指针:

const int Days[12]={31,28,31,30,31,30,31,31,30,31,30,31 }; 
class CDate  
{      
public:   
CDate(int Y = 2016, int M = 1, int D = 1):days(Days);   
private:   
const int* const days;   
};  
类中关于静态变量的定义也是类似:需要在 类外定义且不加static但是要加域名

class CDate  
{      
private:   
static int how_much;   
};
int CDate::how_much=12;  
类中关于静态函数同样如此:需要在 类外定义且不加static但是要加域名

class CDate
{
public:
static bool is_leap_year(int Year);//返回是否是闰年
};
bool CDate::is_leap_year(int Year)
{
return ((Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0));
}
2.前置后置自增运算符重载函数

CDate& operator++();	// ++a			//前置后置自重载函数实现
CDate operator++(int);	//a++
第二个函数中的int是形式上区分标志,无实际意义但是不可缺少。

注意到两个函数的返回值类型不同。第一个前置自增运算符返回的是引用,也就是*this,它将自身自增以后返回它自身。后者返回的是一个临时变量,它先保存原来*this的值,然后*this自增,之后返回这个临时变量,也就是原来的*this。其实现如下:

CDate& CDate::operator++()// ++a
{
int add_year = 0, add_month = 0;
if (day == days[month - 1])
  add_month = 1, day = 1;
else
  day += 1;
///if month==12, add_month==1 or 0, 13%12==1,12%12==0
month = (add_year = month + add_month)==12? 12:add_year%12;  
year += add_year / 12;//or month==11, add_month==1,12%12==0
return *this;//else month = (month + add_month)% 12
}
CDate CDate::operator++(int)//a++
{
CDate temp = *this;
++*this;
return temp;
}
其抽象以后如下:

CDate& CDate::operator++()// ++a
{
//对*this进行操作
//.....<span style="white-space:pre">			</span>
return *this;//返回*this<span style="white-space:pre">					</span>
}
CDate CDate::operator++(int) //a++
{
CDate temp=*this;//保存原来的*this到临时变量
++*this;//*this自增
return temp;//返回原来的*this
}













完成CTime时间类和CDate日期类的设计,使得主程序能够正确运行。 时间类CTime包含私有成员数据时(hour)分(minute)秒(second),均为int类型。 CDate日期类由CTime时间类公有派生而来,包含私有成员数据年(year)月(month)日(day),均为int类型。 main函数已给定,提交时只需要提交main函数外的代码部分。 #include<iostream> using namespace std; //你提交的代码在这里 int main() { int dy,dm,dd,th,tm,ts; cin>>dy>>dm>>dd>>th>>tm>>ts; CTime t1; cout<<"[T1]"; t1.Show(); CDate d1; cout<<"[D1]"; d1.Show(); CDate d2(dy,dm,dd); cout<<"[D2]"; d2.Show(); CDate d3(dy,dm,dd,th,tm,ts); cout<<"[D3]"; d3.Show(); CDate d4(dy,dm,dd,t1); cout<<"[D4]"; d4.Show(); CDate d5(t1); cout<<"[D5]"; d5.Show(); return 0; } Input 1行,包含6个整数,分别代表年,月,日,时,分和秒。 Output 输出包含4行,具体输出格式参照样例。 Sample Input 1 1949 10 1 16 28 37 Sample Output 1 Function #1 is called! [T1]9:10:11 Function #3 is called! Function #1 is called! Function #4 is called! [D1]2023-4-5 9:10:11 Function #3 is called! Function #9 is called! Function #1 is called! Function #5 is called! [D2]1949-10-1 9:10:11 Function #3 is called! Function #9 is called! Function #2 is called! Function #6 is called! [D3]1949-10-1 16:28:37 Function #3 is called! Function #9 is called! Function #0 is called! Function #7 is called! [D4]1949-10-1 9:10:11 Function #3 is called! Function #9 is called! Function #0 is called! Function #8 is called! [D5]2000-12-31 9:10:11 Function #3 is called! Function #9 is called!
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值