第五讲:类的组合

来源:互联网 发布:mac mpv 安装 编辑:程序博客网 时间:2024/06/01 17:26

在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

原创粉丝点击