本文共 2571 字,大约阅读时间需要 8 分钟。
在Student类中,学生的出生日期应设计成日期类的一个对象。类的组合是指一个类中用其他类的对象作为成员的情况。
日期类的定义如下:
class Date
{
public:
Date(int ye=1, int mo=1, int da=1)
{
setData(ye, mo, da);
}
void setData(int ye, int mo, int da)
{
if(check(ye, mo, da) == 1)
{
year = ye;
month = mo;
day = da;
}
else
{
year = month = day = 1;
}
}
int getYear(){return year;}
int getMonth(){return month;}
int getDay(){return day;}
private:
int check(int y, int m, int d)
{
int m_days[13] = {0, 31, 28, 31,30, 31, 30, 31, 31, 30, 31, 30, 31};
int leap = 0;
if(m < 1 || m > 12 || d <1 || y < 1)
return 0;
if(m != 2 && d >m_days[m])
return 0;
if((y % 4 == 0 && y % 100!= 0) || y % 400 == 0)
leap = 1;
if(m == 2 && d >m_days[2] + leap)
return 0;
return 1;
}
private:
int year, month, day;
};
Date类中成员函数check用于检查日期的合法性,而对象的日期不可能非法,也就是说,它仅限于类中使用,因此,定义为私有。
有了日期类,学生类可以修改为:
class Student
{
public:
Student(char *pName="NoName",int se=1, Date bir=Date(1,1,1), int da=1, float gr=0)
{
strcpy(name, pName);
if(se==0 || se==1)
sex = se;
else
sex = 1;
birthday = bir;
if(gr>=0 && gr<=100)
grade = gr;
else
grade = 0;
}
Student(char *pName, int se, int ye, intmo, int da, float gr)
{
setData(pName, se, ye, mo, da,gr);
}
void setData(char *pName, int se, int ye,int mo, int da, float gr)
{
strcpy(name, pName);
if(se==0 || se==1)
sex = se;
else
sex = 1;
birthday.setData(ye, mo, da);
if(gr>=0 && gr<=100)
grade = gr;
else
grade = 0;
}
void showMessage()
{
printf("姓名:%s\n",name);
printf("性别:%s\n",sex==1 ? "男" : "女");
printf("出生日期:%d年%d月%d日\n",birthday.getYear(), birthday.getMonth(), birthday.getDay());
printf("英语成绩:%.1f\n", grade);
}
private:
char name[10];
int sex; //1为男0为女
Date birthday;
float grade;//英语成绩
};
类Student中第一个构造函数既是默认构造函数又支持用Date对象的方式初始化学生对象;第二个构造函数支持用年月日的方式初始化学生对象。
第一个构造函数中语句birthday = bir;用于用bir对象给成员数据birthday赋值。对象可以看成C语言中的结构型变量,而结构型变量是可以相互赋值的(赋值的过程可参见新编C语言程序设计教程P204练习9.50)。
C++中构造函数支持初始化列表。初始化列表用于对类中包含的对象赋值。类Student中第一个构造函数可改写为:
Student(char*pName="NoName", int se=1, Date bir=Date(1,1,1), int da=1, floatgr=0):birthday(bir)
{
strcpy(name, pName);
if(se==0 || se==1)
sex = se;
else
sex = 1;
if(gr>=0 && gr<=100)
grade = gr;
else
grade = 0;
}
类中普通的数据成员也可以看成“对象”,因此,初始化列表可用于所有数据成员的赋值。
类Student成员函数showMessage中输出学生的出生日期时不能以birthday.year的方式直接使用birthday的成员数据,因为它们是birthday的私有成员数据,作用域仅限于birthday的成员函数。
测试程序如下:
int main()
{
Student zhang3;
zhang3.showMessage();
Student li4("Li4", 1, 2000, 10,10, 95);
li4.showMessage();
Student wang5 = Student("Wang5", 0, 2000, 5, 5, 97);
wang5.showMessage();
return0;
}
运行结果如下:
姓名:NoName
性别:男
出生日期:1年1月1日
英语成绩:0.0
姓名:Li4
性别:男
出生日期:2000年10月10日
英语成绩:95.0
姓名:Wang5
性别:女
出生日期:2000年5月5日
英语成绩:97.0
转载地址:http://rcdti.baihongyu.com/