博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二讲:类的封闭性
阅读量:4144 次
发布时间:2019-05-25

本文共 2423 字,大约阅读时间需要 8 分钟。

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

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

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

#include<stdio.h>

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<stdio.h>

#include<string.h>

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++中的结构型与类几乎相同,也可以有成员函数。

转载地址:http://qcdti.baihongyu.com/

你可能感兴趣的文章
Ubuntu下安装Qt
查看>>
Qt札记
查看>>
我的vimrc和gvimrc配置
查看>>
hdu 4280
查看>>
禁止使用类的copy构造函数和赋值操作符
查看>>
C++学习路线
查看>>
私有构造函数
查看>>
组队总结
查看>>
TitledBorder 设置JPanel边框
查看>>
DBCP——开源组件 的使用
查看>>
抓包工具
查看>>
海量数据相似度计算之simhash和海明距离
查看>>
DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
查看>>
DeepLearning tutorial(6)易用的深度学习框架Keras简介
查看>>
DeepLearning tutorial(7)深度学习框架Keras的使用-进阶
查看>>
流形学习-高维数据的降维与可视化
查看>>
Python-OpenCV人脸检测(代码)
查看>>
python+opencv之视频人脸识别
查看>>
人脸识别(OpenCV+Python)
查看>>
6个强大的AngularJS扩展应用
查看>>