华拓科技网
您的当前位置:首页日期类

日期类

来源:华拓科技网
《C++面向对象程序设计》实验报告

一、实验目的:

1、学习类的定义、实例化的方法; 2、学习使用构造函数和析构函数; 3、学习类成员访问控制的运用; 4、学习使用静态成员、内联成员函数; 5、体会面向对象程序设计方法;

6、进一步熟悉Visual C++的编译连接错误,掌握Visual C++调试工具。 二、实验内容:

设计一个日期类:实现加一天的操作,注意为该类设计合适的构造函数和析构函数。请你自己编写一个main函数,main函数中有对日期类的测试,请先使用特定日期来初始化日期类对象,然后再对该对象进行测试,测试中应有求闰年、非闰年的二月月底的第二天、小月月底加一天、大月月底加一天、年底加一天等边缘数据;此外,要求有从一个对象来初始化另一个对象的代码,和计算日期类当前有多少个对象的函数。 三、实验要求:

实验报告以pdf格式提交,pdf文件名为 XXX_YYY_实验1.pdf,其中XXX为学号(字母大写),YYY为姓名。各班由班长统一收齐后,打包发到此邮箱。 四、源代码:

//日期类的头文件Riqi.h #ifndef Riqi_h #define Riqi_h class Date {

private:

int year;//年 int month;//月 int day;//日

static int count;//计算日期类当前有多少个对象的函数的变量 public:

Date();//构造函数,对对象进行初始化

Date(const Date &p);//拷贝构造函数,实现从一个对象来初始化另一个对象的

代码

~Date();//析构函数

void Get_Date();//读出当前日期

void Set_Date(int y,int m,int d);//重新设置日期 int Get_Year();//返回年 int Get_Month();//返回月 int Get_Day();//返回日

static int Get_Total_Num();//静态成员函数,返回count的值 void Add_One_Day();//实现各种加1功能

}; #endif

//日期类的源文件Riqi.cpp #include\"Riqi.h\"//包含头文件 #include using namespace std;

int Date::count=0;//对静态变量进行初始化

Date::Date()//对对象进行初始化,分别赋值 { }

year=2000; month=1; day=1; count++;

void Date::Get_Date()//输出年、月、日 { }

cout<int Date::Get_Year()//得到年 { }

return year;

int Date::Get_Month()//得到月 { }

return month;

int Date::Get_Day()//得到日 { }

return day;

Date::~Date()//析构函数 { }

;

void Date::Set_Date(int y,int m,int d)//对对象进行重新设置 {

year=y; month=m;

}

day=d;

void Date::Add_One_Day()//实现日期的加一功能 {

switch(month) {//大月月底加一天 case 1: case 3: case 5: case 7: case 8: case 10: { if(day<=30) day++; else { month++; day=1; } break; } case 12://年底加一天

{ }

if(day<=30) day++; else { year++; month=1; day=1; }

break;

case 4://小月月底加一天 case 6: case 9: case 11: {

}

if(day<=29) day++; else { month++; day=1; }

break;

case 2://对2月进行操作

{

int Is_Leapyear=((year%4==0&&year%100!=0)||(year%400==0));//判

断是否为闰年

}

if(Is_Leapyear)//闰年二月底的第二天 { }

if(day<=28) day++; else { month++; day=1; }

else//非闰年二月底的第二天 { if(day<=27) day++; else { month++; day=1; } }

break;

default://其他情况 }

break;

}

Date::Date(const Date &p)//进行从一个对象来初始化另一个对象的代码 { }

year=p.year; month=p.month; day=p.day;

cout<<\"Copy Constructor ....\"<int Date::Get_Total_Num()//对静态成员函数进行构造 { }

return count;

//日期类的主程序Riqi_Making.cpp #include\"Riqi.h\" #include using namespace std; void main()

{//构造五个对象,并进行初始化

Date d1; Date d2; Date d3; Date d4; Date d5;

cout<<\"The Date Has been Initialized ....\"<//将初始化结果输出

d1.Get_Date(); d2.Get_Date(); d3.Get_Date(); d4.Get_Date(); d5.Get_Date();

//重置对象

d1.Set_Date(2000,2,29);

d2.Set_Date(2003,2,28); d3.Set_Date(2005,4,30); d4.Set_Date(2006,5,31); d5.Set_Date(2010,12,31);

cout<<\"Before Adding One ....\"<d1.Get_Date(); d2.Get_Date(); d3.Get_Date(); d4.Get_Date(); d5.Get_Date();

//进行加1

d1.Add_One_Day(); d2.Add_One_Day(); d3.Add_One_Day(); d4.Add_One_Day(); d5.Add_One_Day();

cout<<\"After Adding One ....\"<d1.Get_Date(); d2.Get_Date(); d3.Get_Date(); d4.Get_Date(); d5.Get_Date();

//从一个对象来初始化另一个对象的代码

Date d6=d5; d6.Get_Date();

//输出日期类当前对象的函数个数 }

cout<<\"Total Number Of Function:\"<五、运行结果及分析:

运行结果

The Date Has been Initialized .... 2000/1/1 2000/1/1 2000/1/1 2000/1/1 2000/1/1

Before Adding One .... 2000/2/29 2003/2/28 2005/4/30 2006/5/31 2010/12/31

After Adding One .... 2000/3/1 2003/3/1 2005/5/1 2006/6/1 2011/1/1

Copy Constructor .... 2011/1/1

Total Number Of Function:5 Press any key to continue 结果分析:

实验要求进行累的接口与实现的分离,所以在程序设计上应分成头文件、源文件还有相应的应用代码。在实现的过程中,把类的声明放在一个头文件中,并最终以源代码的形式提供给类的用户,函数和类的声明的代码存放在源文件中。

所设计的代码中,先对类进行相应的声明,设定三个数据成员year、month、day。设定了除此之外,还设定了一个静态变量count,用于统计对象的个数。此外,还设置了10个成员函数,其中包括一个构造函数,一个析构函数,一个拷贝构造函数,一个静态成员函数,其相应功能各不相同。构造函数用于对对象的值进行初始化,将其初始化为2000/1/1,以实现实验所要求的用特定日期来初始化日期类对象。其次,因默认析构函数都能满足对象的析构要求,所以在本程序

里,析构函数的内容并没有相应的确定代码。拷贝构造函数用于实现实验的从一个对象来初始化另一个对象的代码要求,但在设置的时候,考虑到简单性,为了实现这一功能,把其程序代码Date d6=d5;放在了较后位置,这也是出于简便角度。静态成员函数在定义类的任何对象之前被调用,其作用是将日期类所对应的对象个数输出。

为满足实验对于测试中应有求闰年、非闰年的二月月底的第二天、小月月底加一天、大月月底加一天、年底加一天等边缘数据,因此把重新设置的时间安排为2000/2/29

2003/2/28 2005/4/30 2006/5/31 2010/12/31,

将以上各种情况包含在内,其经过Add_One_Day()函数的处理后输出下一天的日期,即2000/3/1 出。

但在程序设计上出现的问题最大的是对于static在头文件中的使用问题。由于静态数据成员是静态存储的,是静态生存期的,就必须对它进行初始化。但是初始化却在头文件中进行,导致的结构式程序无法进行正常的链接。在日期类的源文件Riqi.cpp中增加语句 int Date::count=0;对静态变量进行初始化,程序正常运行。运行结果如上所示。 实验心得:

这次实验是《C++面向对象程序设计》的第一次上机试验,对于C++很多基本语法的掌握程度并不是那么的熟悉,这导致了很多时候程序因语法问题而产生不必要的错误,增加了写代码的难度系数。其次,由于对Microsoft Visual Stduio C++6.0的软件还不是太熟悉,导致在调试过程中出现了一些小问题。而且,在使用断点等方式来进行语句错误排查时,也表现出自己的不足。除此之外,自己

2003/3/1

2005/5/1

2006/6/1

2011/1/1,并将其输

对于static的使用也表现出一定的薄弱,对于一些特别的地方,例如:初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化;在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员等知识点的掌握还是不够,在实际应用过程中比较难地结合。

不过,总的来说,这次试验还是比较成功的,这也给了我很大的启发和激励,相信在以后的实验中,我会更加顺利。

因篇幅问题不能全部显示,请点此查看更多更全内容