第二讲:类的封闭性

定义一个结构型变量实际上定义了可用于存储与某对象的多个属性相关的多个普通变量,但结构型变量在使用时有问题。语句struct Student zhang3 = {"Zhang3", 3, 2000, 20, -3, 93.9};在语法上没有问题,但在逻辑上已经出现错误了,因为,张三同学的性别不能取值为3,出生日期也不可能为2000年20月-3日。怎样防止结构型变量中有意义的成员变量被赋值为非法的数据呢?

程序中可以随意使用成员变量,规定每次赋值时都必须进行数据合法性检查只有理论上的可行性,怎样保证每个人都会遵守呢?必须通过机制保证在每次向成员变量赋值时都进行数据合法性检查。

C++中结构型被升级为类,用类定义的变量称为对象。类中的成员变量有访问限制,用关键字private修饰的成员称为私有成员,不能在类外的程序中直接访问。测试程序如下:

#include

class Student

{

private:

       char name[10];

       int sex; //1为男0为女

       int year;

       int month;

       int day;

       float grade;//英语成绩

};

int main()

{

       Student zhang3;

       scanf("%s",zhang3.name);

       return0;

}

编译时会出现下面的错误:

F:\C语言程序示例\cpp\02\02.cpp(15) : errorC2248: 'name' : cannot access private member declared in class 'Student'

不能在程序中直接访问,自然就不可能被赋值为非法数据,但也不能用合法数据赋值哦,怎么使用呢?

与C语言中的结构型相比,C++中的类可以有成员函数。成员函数就函数,但与普通函数相比,其名字比较特殊,这点与类中的成员变量相似。C++保证类中的成员变量不会被赋值为非法数据的机制:

1)把类中的成员变量设置为私有,使其在程序中不能直接访问。

2)把类中的成员函数用public修饰,设置为公有,允许其在程序中使用。为对象中的成员变量赋值时只能通过公有的成员函数,而在成员函数中将会检查数据的合法性。

测试程序如下:

#include

#include

class Student

{

public:

       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;

              if(ye>0)

                     year = ye;

              else

                     year = 2000;

              if(mo>0 && mo<13)

                     month = mo;

              else

                     month = 1;

              if(da>0 && da<31)

                     day = da;

              else

                     day = 1;

              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",year, month, day);

              printf("英语成绩:%.1f\n", grade);

       }

private:

       char name[10];

       int sex; //1为男0为女

       int year;

       int month;

       int day;

       float grade;//英语成绩

};

int main()

{

       Student zhang3;

       int i;

       char name[10];

       int sex, year, month, day;

       float grade;

       for(i=1; i<=2; ++i)

       {

              printf("请输入张三的信息\n");

              scanf("%s", name);

              scanf("%d", &sex);

              scanf("%d%d%d",&year, &month, &day);

              scanf("%f", &grade);

              zhang3.setData(name, sex, year,month, day, grade);

              zhang3.showMessage();

             

       }

      

       return 0;

}

程序的运算情况如下:

请输入张三的信息

Zhang3 1 2000 11 93.9

姓名:Zhang3

性别:男

出生日期:2000年1月1日

英语成绩:93.9

请输入张三的信息

Zhang3 3 200020 -3 93.9

姓名:Zhang3

性别:男

出生日期:2000年1月1日

英语成绩:93.9

对于Student类,有6个私有成员变量,虽然程序中用Student类定义一个对象实际上还是相当于定义了6个普通的变量,但与C语言中的结构型变量不同,这些普通的变量不能在类之外的程序中直接访问。Student类还有2个公有的成员函数,它们的内部名为setData和showMessage,但程序中它们的名字为对象.内部名,与成员变量的名字类似。类中的私有成员变量只有在类的成员函数中使用,也就是说只能通过公有的成员函数setData为对象的成员变量赋值,如果setData中有验证数据合法性的代码,则在程序中不可能把对象的成员变量赋值为非法的数据。

思考:

类是怎样保证其对象的成员变量不被非法的数据赋值的?

提示:

1)Student中的setData函数只是简单地验证了日期的合法性。

2)C++兼容C语言,但C++中的结构型与类几乎相同,也可以有成员函数。

你可能感兴趣的:(C++)