类与对象课件_第1页
类与对象课件_第2页
类与对象课件_第3页
类与对象课件_第4页
类与对象课件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、C+程序设计新世纪应用型高等教育教材编审委员会 组编主编 罗烨 李秉璋第二版新世纪应用型高等教育软件专业系列规划教材第1页,共42页。第5章 类与对象第2页,共42页。5.1 面向对象程序设计概述3对象、类和消息是面向对象技术的核心。1.对象在现实世界中,一切事物(实体)都可看成是面向对象技术中的对象。对象可以是有形的,比如汽车、计算机;也可以是无形的,比如授课、计划。对象可以是简单的,比如一本教材,也可以是复杂的,如由许多元器件构成的手机。任何一个对象都具有属性和行为两大特征。属性用于描述对象的静态特征,比如汽车的功率、载重、轮子个数等。行为描述对象的动态特征,比如前进、倒退、加速。5.1.

2、1 面向对象的概念第3页,共42页。5.1 面向对象程序设计概述42.类类是对象的抽象,对象则是类的具体化,称为类的实例。通常,又称类是一种用于创建对象的模板。在类中,属性通常称为数据,行为称为操作、方法。3.消息各对象间的联系是通过向对象发送消息来实现的。要使对象实现某种行为,必须向对象发送相应的消息。5.1.1 面向对象的概念第4页,共42页。5.1 面向对象程序设计概述5面向对象程序设计的一个简单定义是:将具有相同特征(即具有相同数据和操作)的同一组对象用类来描述。面向对象程序设计是把程序构造成由若干个对象组成,每个对象由一些数据以及对这些数据实施的操作构成。对数据的操作是通过向对象发送

3、消息来实现的。5.1.2 什么是面向对象程序设计第5页,共42页。5.1 面向对象程序设计概述6从上述定义可以看出,面向对象程序设计和之前的面向过程程序设计存在不同之处:5.1.2 什么是面向对象程序设计(1)在面向过程的程序设计中,函数是构成程序的基本模块。在面向对象的程序设计中,对象是构成程序的基本模块。(2)在面向过程的程序设计中,数据和操作是分离的,数据作为参数传递给对数据进行操作的函数。在面向对象的程序设计中,数据和操作是封装在一起的,形成一个整体。(3)在面向过程的程序设计中,数据的表示是公开的,用户可以直接对数据进行处理。在面向对象的程序设计中,用户只能通过对象发送消息来操作数据

4、。第6页,共42页。5.1 面向对象程序设计概述7面向对象程序设计具有以下几个特点:5.1.3 面向对象程序设计的特点1.抽象2.封装性3.继承性4.多态性第7页,共42页。5.1 面向对象程序设计概述8软件开发方法或技术有优劣之分,对一个软件开发方法或技术的评价标准主要是看它的开发效率和对软件质量的保证程度。开发效率指使用该方法或技术进行软件开发的难易程度以及它对缩短开发周期的支持程度。软件质量是指用该方法或技术开发出的软件的正确性、健壮性、可复用性、易维护性以及效率等。5.1.4 面向对象的优点1.数据与操作合一2.软件复用3. 软件维护第8页,共42页。5.2 类与对象概述9在C+中,类

5、定义的语法格式如下:5.2.1 类定义第9页,共42页。5.2 类与对象概述10对于类定义,需要说明以下几点:(1)类属于类型范畴,系统不会为类分配内存空间,就像系统不会为int、double等类型分配内存一样。因此在类定义中不能对数据成员进行初始化。(2)类的三种访问控制private、public、protected,在类中没有先后次序,可以多次出现,也可以不出现。C+规定,类中默认的访问控制是私有的,即private。(3)和结构体定义类似,类定义结束的最后必须加分号“;”。(4)在CGoods类定义中只对成员函数进行了声明,并没有对其进行定义。(5)类的成员不能使用auto、regis

6、ter和extern等修饰符,一般只能用static修饰符。5.2.1 类定义第10页,共42页。5.2 类与对象概述11在C+中有三种成员访问控制类型:5.2.2 类成员的访问控制公有类型public私有类型private保护类型protected第11页,共42页。5.2 类与对象概述12类成员的访问控制:将需要隐藏的成员设为私有类型,成为一个外部无法访问的黑盒子;将提供给外界的接口设为公有类型,对外部就是透明的;而保护成员就相当于一个笼子,它给派生类提供一些特殊的访问控制。5.2.2 类成员的访问控制第12页,共42页。5.2 类与对象概述13建立对象的方法类似于定义变量。语法格式为:5

7、.2.3 对象的创建与使用定义了对象后,对对象成员的访问采用如下形式:第13页,共42页。5.2 类与对象概述14建立同类对象后,每个对象中的数据成员都占用独立的存储空间,保存着各自的数据。而对于同类对象,它们的成员函数都是相同的代码,没有必要为每个同类对象的成员函数分配独立的存储空间,只需为类的成员函数分配一份存储空间,存放代码。而这份代码被这个类的所有对象共用。5.2.4 对象的存储方式第14页,共42页。5.2 类与对象概述151.对象指针也可以使用对象指针访问对象。对象指针遵循一般指针的规则。例如: CGoods car, *pcar ; /pcar为CGoods类的指针 pcar=&

8、car ; /pcar指向了car前面已经介绍过,使用“对象名.成员名”就可以访问对象成员。有了指向对象的指针,可以通过该指针经成员访问运算符“-”访问对象成员。5.2.5 对象指针和成员指针第15页,共42页。5.2 类与对象概述162.成员指针也可以通过指针访问对象成员。指向对象成员的指针使用前要先定义,再赋值,最后引用。定义对象成员指针的语法格式为:定义了指向成员的指针之后,需要对其赋值,也就是要确定指针指向类中哪一个成员。对成员指针赋值的语法形式为:5.2.5 对象指针和成员指针第16页,共42页。5.3 构造函数和析构函数171.构造函数的定义类的构造函数的作用是在对象建立后,对对象

9、的非静态数据成员初始化。构造函数的定义形式如下:5.3.1 构造函数的定义与调用第17页,共42页。5.3 构造函数和析构函数182.构造函数的调用如前述,构造函数的作用是完成对象初始化。因此在新建对象获得内存空间后,该对象就要调用构造函数,对数据成员进行初始化。这一过程是自动进行的。当类中有多个构造函数时,系统根据对象提供的参数决定调用哪个构造函数。我们以三参数构造函数5.3.1 构造函数的定义与调用第18页,共42页。5.3 构造函数和析构函数193.成员初始化表对于类的构造函数,还有如下形式:成员初始化表的作用是向类传递初始化时的参数,并初始化数据成员。成员初始化表的具体格式是:5.3.

10、1 构造函数的定义与调用第19页,共42页。5.3 构造函数和析构函数20类的析构函数的作用是在对象生存期结束时进行必要的处理工作。析构函数定义形式如下:析构函数也是类的特殊的成员函数,具有以下特征:(1)析构函数名由“”符号和类名构成。(2)当一个对象的生存期结束时,对象会自动调用析构函数,完成对象生存期结束时必要的处理,例如释放由构造函数申请的内存等。(3)如果类定义中没有显式定义析构函数,编译器也会为类建立一个不具有任何功能的默认的析构函数,其形式为:(4)在一个作用域中存在多个对象时,各对象遵循“先构造、后析构;后构造、先析构”的析构次序。5.3.2 析构函数的定义与调用第20页,共4

11、2页。5.4 复制构造函数21引用是另一个变量的别名。通过引用名和被引用的变量名访问变量的效果是一样的。定义引用的语法格式为:对于引用,还需要注意以下两点:(1)一个引用,只能引用变量,不能引用常量或表达式。即只能引用有地址的对象。(2)引用与被引用之间,不能像普通类型的变量一样,可以进行类型转换。5.4.1 引用及函数的引用调用第21页,共42页。5.4 复制构造函数221.复制构造函数的定义由于复制构造函数也属于构造函数,所以其函数名仍然是类名。参数只有一个,类型是同类引用。复制构造函数定义格式如下:2.复制构造函数的调用和构造函数、析构函数一样,复制构造函数也是由对象自动调用的。当出现以

12、下三种情况时,需要获取数据的对象要调用复制构造函数完成自身初始化。5.4.2 复制构造函数的定义与调用第22页,共42页。5.4 复制构造函数233.对象的赋值C+系统为类提供了默认的赋值运算,使得同类对象可以像普通变量一样进行赋值运算同类对象间对应数据成员赋值,称之为“按成员赋值”。在大多数情况下,类的默认赋值运算已经满足要求,也就不需要再自行定义赋值运算。5.4.2 复制构造函数的定义与调用第23页,共42页。5.4 复制构造函数241.默认复制构造函数的问题2.类的深复制所谓深复制,就是给每个对象分配一个独立的内存区域,达到如图所示的存储布局。5.4.3 复制与深复制第24页,共42页。

13、5.4 复制构造函数25在类中,数据成员的类型可以是基本数据类型,也可以是类类型,即其他类的对象作为一个类的数据成员。这样的成员称为对象成员(又称成员对象),含有对象成员的类称为组合类(又称聚合类)。在建立组合类对象时,组合类的构造函数要对所有对象成员、数据成员初始化。因此组合类的构造函数语法格式如下:5.4.4 组合类与构造函数第25页,共42页。5.4 复制构造函数26组合类的构造函数执行顺序是:5.4.4 组合类与构造函数(1)首先按照对象成员在组合类中的定义顺序,调用对象成员的构造函数,完成对象成员的初始化。(2)按照数据成员在组合类中的定义顺序,对成员初始化表中各数据成员初始化。(3

14、)最后执行组合类构造函数的函数体。第26页,共42页。5.5 类的静态成员27当一个类的各对象需要共享数据,可以在类定义中用关键字static将该数据说明为静态数据成员。这样静态数据成员在内存只存储一份,被该类的所有对象所共享。因此一般用类名来引用类的静态成员。5.5.1 静态数据成员第27页,共42页。5.5 类的静态成员28对静态数据成员再说明两点:(1)对静态数据使用前,必须要在类外进行定义性说明,格式如下:(2)任何对象的释放,都不影响静态数据成员生存期。静态数据成员是在程序开始运行时获得内存,程序结束运行时释放内存。但其作用域仅限于定义该类的作用域。5.5.1 静态数据成员第28页,

15、共42页。5.6 常对象与常成员29如果在声明一个引用时用const修饰,被声明的引用就是常引用。常引用所引用的对象不能被更新。常引用的定义语法为:5.6.1 常引用第29页,共42页。5.6 常对象与常成员30如果在声明一个引用时用const修饰,被声明的引用就是常引用。常引用所引用的对象不能被更新。常引用的定义语法为:5.6.2 常对象第30页,共42页。5.6 常对象与常成员31使用const说明的数据成员称为常数据成员。常数据成员的定义与一般常变量的定义方法相同。常数据成员只能通过构造函数的成员初始化表进行初始化,此后在对象的生存期中不能再作任何更改。常数据成员定义的格式如下:5.6.

16、3 常数据成员第31页,共42页。5.6 常对象与常成员32在类中用const关键字修饰的函数,称为常成员函数。常成员函数的声明格式如下:5.6.4 常成员函数第32页,共42页。5.7 类的友元33在类中用关键字friend修饰一个函数的声明,该函数就成为这个类的友元函数。友元函数可以是一个普通函数,也可以是其他类的成员函数。友元函数在类中的声明语法格式为:5.7.1 友元函数第33页,共42页。5.7 类的友元34友元可以是函数,还可以是类。可以将一个类声明为另一个类的友元类。例如将B类声明为A类的友元类。这样B类的所有成员函数都是A类的友元函数,在B类的成员函数中,可以通过A类对象访问A

17、类的所有成员。通常将友元类设计为一种对数据操作或类之间传递消息的辅助类。5.7.2 友元类第34页,共42页。5.7 类的友元35关于友元关系,还有以下性质:5.7.2 友元类(1)友元关系是不传递的。(2)友元关系是单向的。(3)友元关系是不被继承的。第35页,共42页。5.8 类应用实例公司人员管理程序36从20世纪70年代到90年代,出现了大批面向对象的程序设计语言,同时出现了大批面向对象的建模语言。这些建模语言功能类似,但在表述上存在差异,给软件的交流带来困难。于是OMG(ObjectManagementGroup)经过多年努力,于2003年建立了统一建模语言(UML)。UML语言的主要内容是使用各种图符描述软件模型的静态结构、动态行为和模块组织与管理。本节仅介绍类与对象的UML图形描述以及它们之间的静态关系。对UML感兴趣的读者可以参考相关书籍,了解更多UML语言的内容。5.8.1 UML简介第36页,共42页。5.8 类应用实例公司人员管理程序371.类在UML语言中,用一个由上到下分为三部分的矩形来表示一个类。类名在顶部区域,数据成员(UML中称为属性)在中间区域,成员函数(UML中称为操作)在底部区域。除了名称部分外,其他两个部分是可选的,即类的属性和操作可以不表示出来,也就是说,一个写了类名的矩形

温馨提示

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

评论

0/150

提交评论