《C++与面向对象》第4章(人民邮电出版社)_第1页
《C++与面向对象》第4章(人民邮电出版社)_第2页
《C++与面向对象》第4章(人民邮电出版社)_第3页
《C++与面向对象》第4章(人民邮电出版社)_第4页
《C++与面向对象》第4章(人民邮电出版社)_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象程序设计及C++

主讲:第4章类中数据的共享与保护面向对象程序设计及C++本章作业作业本:本章习题:一、二〔1、3〕、三、四〔1、3〕10:40本章内容提要4.1静态成员4.2共享数据的保护4.3程序实例-----学生信息管理系统本章小结10:404.1静态成员在类的定义中,可以用关键字static声明成员为静态的,这些静态成员可以在同一个类的不同对象之间提供数据共享。不管这个类创立了多少个对象,但静态成员只有一个拷贝〔副本〕,被所有属于这个类的对象共享。静态成员包括静态数据成员和静态成员函数10:404.1.1静态数据成员静态数据成员是解决同一个类的不同对象之间数据共享问题,同一个类所有的对象共享此成员,该成员只有一份拷贝

静态数据成员的声明形式为:

static类型名静态数据成员名;静态数据成员的初始化必须在类外进行,默认值为0,形式为:

类型名类名::静态数据成员名=初值;注意:前面不能再加static10:404.1.1静态数据成员公有的静态数据成员可以在对象定义之前被访问,形式为:类名::公有静态成员变量名;在对象定义后还可以通过对象进行访问,形式为:对象名.公有静态成员变量名私有的静态数据成员不能被类的外部函数访问,也不能用对象直接进行访问。10:404.1.1静态数据成员程序4.1请在编程环境下直接运行演示特别注意:(1)类内的语句staticinttotal;用来定义一个公有的静态数据成员total(2)类体外语句:intStudent::total=0;用来初始化静态数据成员(3)两个构造函数中均有total++;语句(4)析构函数中有total--;语句10:404.1.1静态数据成员主函数中访问total的多种方式:(1)Student::total,对公有的静态数据成员,无论是否认义对象均可用此形式访问(2)当用指针p申请了动态对象空间之后,可以用p->total即(*p).total形式访问(3)s[0].total和s[1].total均表达为通过对象来访问此静态数据成员(4)思考:将staticinttotal;移动到private:的下方作为私有成员,重新编译程序观察结果并解释原因10:404.1.2静态成员函数为什么要有静态成员函数?(1)如果静态数据成员不是公有成员,那么无法直接用类名或对象名来访问,这时,必定要借助于类的公有成员函数来间接访问。由于静态数据成员是整个类公有的,不属于任何对象,因此希望公有成员函数对静态数据成员的访问也不必依赖对象,可以通过类名来访问,普通成员函数无法满足这一要求因此需要将专门用来访问非公有静态数据成员的函数定义为静态成员函数10:404.1.2静态成员函数静态成员函数在类内的原型声明形式:static返回值类型静态成员函数名〔形式参数表〕;声明为static的成员函数在类的范围内共享,它属于该类的所有对象,只能直接访问静态数据成员,不能对类的其他类型的数据成员或成员函数进行访问。可以通过类名或对象名进行调用,形式如下:类名::静态成员函数名〔实际参数表〕;或对象名.静态成员函数名〔实际参数表〕;10:404.1.2静态成员函数程序4.2请在编程环境下直接运行演示特别注意:(1)类内的语句staticinttotal;放在prirate:下,用来定义一个私有的静态数据成员(2)类体内的staticvoidPrint();用来声明一个公有的静态成员函数(3)主函数中调用该静态成员函数来间接访问私有属性的静态数据成员:

Student::Print();p->Print();s[0].Print(); s[1].Print();

10:404.1.2静态成员函数特别说明:(1)静态成员函数与普通的成员函数不同,无this指针(2)静态成员函数几乎是专门为方便操作非公有属性的静态数据成员而设的(3)一般不用来访问非静态成员返回10:404.2共享数据的保护为解决数据共享与数据平安的统一,C++语言通过适时地巧用关键字const,对相应的数据进行保护。主要有3种用法:(1)常数据成员:类内的某一数据成员不能被修改(2)常成员函数:类的成员函数只能访问类内的其他成员而不允许修改(3)常对象:整个对象不能被修改10:404.2.1常数据成员类中需要用到常量,定义为全局常量显然不利于代码移植因此,在类中通过定义常数据成员,仅在本类中起作用,方便了类的移植。常数据成员在类内的定义形式为:const类型名常数据成员名;常数据成员的初始化只能在构造函数的初始化列表中进行,形式为:构造函数首部:常数据成员名〔用来初始化的常量或常量表达式〕10:404.2.1常数据成员【例4.3】常数据成员的初始化及访问例如,定义圆类Circle,其中定义一个常数据成员PI表示圆周率,类中定义函数实现求圆的面积及周长。该例由3个文件组成,注意文件包含的正确使用.请在编程环境下运行该程序,注意多文件结构的程序的定义方法.本程序中请特别关注第一个文件中:(1)constdoublePI;定义常数据成员PI表圆周率(2)构造函数首部用初始化列表初始常数据成员:Circle(doubler=0):PI(3.1415926)10:404.2.1常数据成员例4.3中类Circle的常数据成员PI,与普通成员相比不可被修改。但它与普通数据成员有一个共性——都是跟着对象走的,每个对象中都保存有一份PI的拷贝,造成了数据冗余。改进方式:将PI定义为静态常数据成员。修改方法:(1)在example4_03_Circle..h头文件中将constdoublePI;修改为:staticconstdoublePI;(2)在example4_03_Circle.cpp文件中增加一条语句:constdoubleCircle::PI=3.1415926;10:404.2.2常成员函数如果一个成员函数对类中数据成员只作访问而不作直接或间接的修改,那么最好将此成员函数说明为常成员函数,以明确表示它对数据成员的保护性。常成员函数的原型声明格式如下:类型

函数名〔形式参数表〕

const;说明:这里的const是函数类型的一个组成局部,故原型声明和定义首部都必须要有,并且可以作为函数重载的标志10:404.2.2常成员函数常成员函数一般不调用普通函数,以防止间接修改数据成员的值反之,普通函数可以调用常成员函数【例4.4】常成员函数的定义及调用例如。在例4.3的根底上作修改。请直接在编程环境下运行,注意与4.3的区别在头文件中增加了:doubleGetRadius()const;在对应实现文件中增加了以上常成员函数实现代码在主函数中增加了对该函数的调用10:40对象在其整个生存期内都不能被改变,这时,需要将对象说明为常对象。常对象的所有数据成员的值在整个生存期内不能被更新。常对象的说明格式如下:类名

const

对象名;或const

类名

对象名;定义常对象时必须进行初始化,而且其对象的数据成员值不能修改。常对象只能调用它的常成员函数而不能调用普通的成员函数4.2.3常对象10:40【例4.5】常对象与常成员函数的应用例如。定义一个Person类,分别定义该类的常对象和普通对象,注意重载的Print()函数的调用情况。请在编程环境下直接运行程序注意几个问题:(1)类中有一对重载的函数:voidPrint(); //普通成员函数voidPrint()const;//常成员函数4.2.3常对象10:40(2)主函数中的p1为常对象,p2为普通对象,调用print()函数时,注意各自调用的版本(3)思考:分别将普通成员函数print或静态成员函数print删除掉,再重新编译链接运行程序,观察结果并解释原因4.2.3常对象返回10:40请在编程环境下运行完整的程序.在第3章的根底上,作以下一些修改:〔1〕为统计真正在效的学生人数,将原来的全局变量count改为定义在类Student中的静态数据成员,并且设为私有属性以表达信息隐藏的特性。〔2〕为访问count,特别增加了静态成员函数 staticintGetCount();〔3〕将某些成员函数,不改变数据成员值的改成常成员函数,例如:GetName、GetAge和Display函数。还有一些函数内部的形式参数,必要时加了const以保护对应实参。4.3程序实例——学生信息管理系统10:40〔4〕类中增加了两个成员函数:Insert()和Delete(),效劳于后面新增加的插入和删除功能。〔5〕主函数中增加了两个功能:插入和删除一条学生记录,因此菜单上增加了两个条目。在流程控制中增加两个分支。〔6〕由于此程序中的删除只是简单地将age成员修改为0,也就是说,只要age成员值为0,那么认为此元素位置上的元素值是无效的,可能是随机值,也有可能是曾经被删除的,因此在OutputStu()数中控制输出所有有效元素时的循环控制条件与第三章中不同,同时输出学生总人数的时候也与原来不同,涉及到静态成员函数的访问,读者需要注意比照。4.3程序实例——学生信息管理系统10:40〔7〕与〔6〕同样的考虑,函数SearchStu()的实现也与第三章中不同,循环控制条件需要修改,在比照名字字符串之前,必须先确认该记录是否有效,即判断年龄是否为0。在第三章中不涉及插入删除,所以记录的从0下标依次存放的,读者需要注意比照。〔8〕插入和删除函数中分别考虑了是否满和是否空的边界条件。4.3程序实例——学生信息管理系统返回10:40本章小结本章介绍同类对象间数据共享与保护相关的问题,主要知识点如下:〔1〕静态数据成员是为所有同类对象共享,必须在类外进行初始化。对于公有静态数据成员,可以通过类名或对象名直接调用;对于私有静态数据成员,那么需要通过成员函数间接访问。〔2〕静态成员函数一般专门用来操作静态数据成员,它也是可以通过类名或对象名来调用,静态成员函数与一般成员函数相比,最大的区别是它没有this

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论