《第5章--类与对象.pptx》由会员分享,可在线阅读,更多相关《第5章--类与对象.pptx(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+程序设计新世纪应用型高等教育教材编审委员会 组编主编 罗烨 李秉璋第二版新世纪应用型高等教育软件专业系列规划教材第5章 类与对象5.1 面向对象程序设计概述3对象、类和消息是面向对象技术的核心。对象、类和消息是面向对象技术的核心。1.对象对象在现实世界中在现实世界中,一切事物一切事物(实体实体)都可看成是面向对象技术中的对象。对象可以是都可看成是面向对象技术中的对象。对象可以是有形的有形的,比如汽车、计算机比如汽车、计算机;也可以是无形的也可以是无形的,比如授课、计划。对象可以是简单的比如授课、计划。对象可以是简单的,比如一本比如一本教材教材,也也可以是复杂的可以是复杂的,如由许多元器件构
2、成的手机。任何一个对象都具有属性和行为两大如由许多元器件构成的手机。任何一个对象都具有属性和行为两大特征特征。属。属性用于描述对象的静态特征性用于描述对象的静态特征,比如汽车的功率、载重、轮子个数等。行为描述对象比如汽车的功率、载重、轮子个数等。行为描述对象的动态的动态特特征征,比如前进、倒退、加速。比如前进、倒退、加速。5.1.1 面向对象的概念5.1 面向对象程序设计概述42.类类类是对象的抽象类是对象的抽象,对象则是类的具体化对象则是类的具体化,称为称为类的实例。通常类的实例。通常,又称类是一种用于创建对象的又称类是一种用于创建对象的模板模板。在。在类中类中,属性通常称为数据属性通常称为
3、数据,行为称为操作、行为称为操作、方法方法。3.消息消息各对象间的联系是通过向对象发送消息来各对象间的联系是通过向对象发送消息来实现的。要使对象实现某种行为实现的。要使对象实现某种行为,必须向必须向对象对象发发送相应的消息送相应的消息。5.1.1 面向对象的概念5.1 面向对象程序设计概述5面向对象程序设计的一个简单定义是面向对象程序设计的一个简单定义是:将将具有相同特征具有相同特征(即具有相同数据和操作即具有相同数据和操作)的的同一同一组对象用类来描述。面向对象程组对象用类来描述。面向对象程序设计是把程序构造成由若干个对象组成序设计是把程序构造成由若干个对象组成,每个对象每个对象由一些由一些
4、数据以及对这些数据实施数据以及对这些数据实施的操作构成。对数据的操作是通过向对象发送消息来的操作构成。对数据的操作是通过向对象发送消息来实现实现的。的。5.1.2 什么是面向对象程序设计5.1 面向对象程序设计概述6从上述定义可以看出从上述定义可以看出,面向对象程序设计和之前的面向过程程序设计存在不同之处面向对象程序设计和之前的面向过程程序设计存在不同之处:5.1.2 什么是面向对象程序设计(1)在面向过程的程序设计中在面向过程的程序设计中,函数是构成程序的基本模块。在面向对象的函数是构成程序的基本模块。在面向对象的程程序设计中序设计中,对象是构成程序的基本模块。对象是构成程序的基本模块。(2
5、)在面向过程的程序设计中在面向过程的程序设计中,数据和操作是分离的数据和操作是分离的,数据作为参数传递给对数数据作为参数传递给对数据据进行操作进行操作的函数。在面向对象的程序设计中的函数。在面向对象的程序设计中,数据和操作是封装在一起的数据和操作是封装在一起的,形成一形成一个整体。个整体。(3)在面向过程的程序设计中在面向过程的程序设计中,数据的表示是公开的数据的表示是公开的,用户可以直接对数据进行用户可以直接对数据进行处理处理。在。在面向对象的程序设计中面向对象的程序设计中,用户只能通过对象发送消息来操作数据。用户只能通过对象发送消息来操作数据。5.1 面向对象程序设计概述7面向对象程序设计
6、具有以下几个特点面向对象程序设计具有以下几个特点:5.1.3 面向对象程序设计的特点1.抽象2.封装性3.继承性4.多态性5.1 面向对象程序设计概述8软件开发方法或技术有优劣之分软件开发方法或技术有优劣之分,对一个软件开发方法或技术的评价标准主要是看对一个软件开发方法或技术的评价标准主要是看它的它的开发效率和对软件质量的保证程度。开发效率指使用该方法或技术进行软件开发开发效率和对软件质量的保证程度。开发效率指使用该方法或技术进行软件开发的难的难易程度易程度以及它对缩短开发周期的支持程度。软件质量是指用该方法或技术开发出以及它对缩短开发周期的支持程度。软件质量是指用该方法或技术开发出的软件的的
7、软件的正确性正确性、健壮性、可复用性、易维护性以及效率等。、健壮性、可复用性、易维护性以及效率等。5.1.4 面向对象的优点1.数据与操作合一数据与操作合一2.软件复用件复用3.软件件维护5.2 类与对象概述9在在C+中中,类定义的语法格式如下类定义的语法格式如下:5.2.1 类定义5.2 类与对象概述10对于类定义对于类定义,需要说明以下几点需要说明以下几点:(1)类属于类型范畴类属于类型范畴,系统不会为类分配内存空间系统不会为类分配内存空间,就像系统不会为就像系统不会为int、double等类等类型分配型分配内存一样。因此在类定义中不能对数据成员进行初始化内存一样。因此在类定义中不能对数据
8、成员进行初始化。(2)类的三种访问类的三种访问控制控制private、public、protected,在类中没有先后次序在类中没有先后次序,可以多次出可以多次出现现,也也可以不出现。可以不出现。C+规定规定,类中默认的访问控制是私有的类中默认的访问控制是私有的,即即private。(3)和结构体定义类似和结构体定义类似,类定义结束的最后必须加分号类定义结束的最后必须加分号“;”。(4)在在CGoods类定义类定义中只对成员函数进行了声明中只对成员函数进行了声明,并没有对其进行定义并没有对其进行定义。(5)类的成员不能使用类的成员不能使用auto、register和和extern等修饰符等修饰
9、符,一般只能用一般只能用static修饰符。修饰符。5.2.1 类定义5.2 类与对象概述11在在C+中有中有三种成员访问控制类型三种成员访问控制类型:5.2.2 类成员的访问控制公有公有类型型public私有私有类型型private保保护类型型protected5.2 类与对象概述12类成员的访问控制类成员的访问控制:将需要隐藏的成员设为私有类型将需要隐藏的成员设为私有类型,成为一个成为一个外部外部无法访问的黑无法访问的黑盒子盒子;将提供给外界的接口设为公有类型将提供给外界的接口设为公有类型,对外部就是透明的对外部就是透明的;而保护而保护成员就成员就相当于一个相当于一个笼子笼子,它给派生类提
10、供一些特殊的访问控制。它给派生类提供一些特殊的访问控制。5.2.2 类成员的访问控制5.2 类与对象概述13建立对象的方法类似于定义变量。语法格式为建立对象的方法类似于定义变量。语法格式为:5.2.3 对象的创建与使用定义了对象后定义了对象后,对对象成员的访问采用如下形式对对象成员的访问采用如下形式:5.2 类与对象概述14建立同类对象后建立同类对象后,每个对象中的数据成员都占用独立的存储空间每个对象中的数据成员都占用独立的存储空间,保存着各自的数据。保存着各自的数据。而对于而对于同类对象同类对象,它们的成员函数都是相同的代码它们的成员函数都是相同的代码,没有必要为每个同类对象的成员函数没有必
11、要为每个同类对象的成员函数分配分配独立的独立的存储空间存储空间,只需为类的成员函数分配一份存储空间只需为类的成员函数分配一份存储空间,存放代码。而这份代码被存放代码。而这份代码被这个类的这个类的所有所有对象共用。对象共用。5.2.4 对象的存储方式5.2 类与对象概述151.对象指针对象指针也可以使用对象指针访问对象。对象指针遵循一般指针的规则。例如也可以使用对象指针访问对象。对象指针遵循一般指针的规则。例如:CGoods car,*pcar;/pcar为为CGoods类类的指针的指针 pcar=&car;/pcar指向了指向了car前面已经介绍过前面已经介绍过,使用使用“对象名对象名.成员成
12、员名名”就可以访问对象成员。有了指向对象的指就可以访问对象成员。有了指向对象的指针针,可以可以通过该指针经成员访问运算符通过该指针经成员访问运算符“-”访问访问对象成员对象成员。5.2.5 对象指针和成员指针5.2 类与对象概述162.成员成员指针指针也可以通过指针访问对象成员。指向对象成员的指针使用前要先定义也可以通过指针访问对象成员。指向对象成员的指针使用前要先定义,再赋值再赋值,最后最后引用引用。定义对象成员指针的语法格式为。定义对象成员指针的语法格式为:定义了指向成员的指针之后定义了指向成员的指针之后,需要对其赋值需要对其赋值,也就是要确定指针指向类中哪一个成员也就是要确定指针指向类中
13、哪一个成员。对对成员指针赋值的语法形式为成员指针赋值的语法形式为:5.2.5 对象指针和成员指针5.3 构造函数和析构函数171.构造构造函数的定义函数的定义类的构造函数的作用是在对象建立后类的构造函数的作用是在对象建立后,对对象的非静态数据成员初始化。构造函数对对象的非静态数据成员初始化。构造函数的的定义定义形式如下形式如下:5.3.1 构造函数的定义与调用5.3 构造函数和析构函数182.构造构造函数的调用函数的调用如前述如前述,构造函数的作用是完成对象初始化。因此在新建对象获得内存空间后构造函数的作用是完成对象初始化。因此在新建对象获得内存空间后,该该对对象就要象就要调用构造函数调用构造
14、函数,对数据成员进行初始化。这一过程是自动进行的。当类中有多个对数据成员进行初始化。这一过程是自动进行的。当类中有多个构构造函数造函数时时,系统根据对象提供的参数决定调用哪个构造函数。我们以三参数构造函数系统根据对象提供的参数决定调用哪个构造函数。我们以三参数构造函数5.3.1 构造函数的定义与调用5.3 构造函数和析构函数193.成员成员初始化表初始化表对于类的构造函数对于类的构造函数,还有如下形式还有如下形式:成员初始化表的作用是向类传递初始化时的参数成员初始化表的作用是向类传递初始化时的参数,并初始化数据成员。成员初始化并初始化数据成员。成员初始化表表的的具体格式是具体格式是:5.3.1
15、 构造函数的定义与调用5.3 构造函数和析构函数20类的析构函数的作用是在对象生存期结束时进行必要的处理工作。析构函数定义类的析构函数的作用是在对象生存期结束时进行必要的处理工作。析构函数定义形式形式如下如下:析构函数也是类的特殊的成员函数析构函数也是类的特殊的成员函数,具有以下特征具有以下特征:(1)析构函数名由析构函数名由“”符号和类名构成。符号和类名构成。(2)当一个对象的生存期结束时当一个对象的生存期结束时,对象会自动调用析构函数对象会自动调用析构函数,完成对象生存期结束时完成对象生存期结束时必要必要的处理的处理,例如例如释放由构造函数申请的内存等释放由构造函数申请的内存等。(3)如果
16、类定义中没有显式定义析构函数如果类定义中没有显式定义析构函数,编译器也会为类建立一个不具有任何功能编译器也会为类建立一个不具有任何功能的默认的默认的析构函的析构函数数,其形式为其形式为:(4)在一个作用域中存在多个对象时在一个作用域中存在多个对象时,各对象遵循各对象遵循“先构造、后析构先构造、后析构;后构造、先析构后构造、先析构”的析的析构次序构次序。5.3.2 析构函数的定义与调用5.4 复制构造函数21引用是另一个变量的别名。通过引用名和被引用的变量名访问变量的效果是一样的引用是另一个变量的别名。通过引用名和被引用的变量名访问变量的效果是一样的。定义定义引用的语法格式为引用的语法格式为:对
17、于引用对于引用,还需要注意以下两点还需要注意以下两点:(1)一个引用一个引用,只能引用变量只能引用变量,不能引用常量或表达式。即只能引用有地址的对象。不能引用常量或表达式。即只能引用有地址的对象。(2)引用与被引用之间引用与被引用之间,不能像普通类型的变量一样不能像普通类型的变量一样,可以进行类型转换可以进行类型转换。5.4.1 引用及函数的引用调用5.4 复制构造函数221.复制复制构造函数的定义构造函数的定义由于复制构造函数也属于构造函数由于复制构造函数也属于构造函数,所以其函数名仍然是类名。参数只有一个所以其函数名仍然是类名。参数只有一个,类型类型是是同类同类引用。复制构造函数定义格式如
18、下引用。复制构造函数定义格式如下:2.复制复制构造函数的调用构造函数的调用和构造函数、析构函数一样和构造函数、析构函数一样,复制构造函数也是由对象自动调用的。当出现以下三种复制构造函数也是由对象自动调用的。当出现以下三种情情况况时时,需要获取数据的对象要调用复制构造函数完成自身初始化需要获取数据的对象要调用复制构造函数完成自身初始化。5.4.2 复制构造函数的定义与调用5.4 复制构造函数233.对象对象的赋值的赋值C+系统系统为类提供了默认的赋值运算为类提供了默认的赋值运算,使得同类对象可以像普通变量一样进行赋值使得同类对象可以像普通变量一样进行赋值运算运算同类对象间对应数据成员赋值同类对象
19、间对应数据成员赋值,称之为称之为“按成员赋值按成员赋值”。在大多数情况下。在大多数情况下,类的默认类的默认赋赋值值运算已经满足要求运算已经满足要求,也就不需要再自行定义赋值运算。也就不需要再自行定义赋值运算。5.4.2 复制构造函数的定义与调用5.4 复制构造函数241.默认默认复制构造函数的复制构造函数的问题问题2.类类的深复制的深复制所谓深所谓深复制复制,就是给每个对象分配一个独立的内存区域就是给每个对象分配一个独立的内存区域,达到如达到如图所示图所示的存储布局。的存储布局。5.4.3 复制与深复制5.4 复制构造函数25在类中在类中,数据成员的类型可以是基本数据类型数据成员的类型可以是基
20、本数据类型,也可以是类类型也可以是类类型,即其他类的对象即其他类的对象作为一作为一个类的数据成员。这样的成员称为对象成员个类的数据成员。这样的成员称为对象成员(又称成员对象又称成员对象),含有对象成员的类称为含有对象成员的类称为组合组合类类(又称聚合类又称聚合类)。在建立组合类对象时在建立组合类对象时,组合类的构造函数要对所有对象成员、数据成员初始化。因此组合类的构造函数要对所有对象成员、数据成员初始化。因此组组合合类的构造函数语法格式如下类的构造函数语法格式如下:5.4.4 组合类与构造函数5.4 复制构造函数26组合类的构造函数执行顺序是组合类的构造函数执行顺序是:5.4.4 组合类与构造
21、函数(1)首先按照对象成员在组合类中的定义顺序首先按照对象成员在组合类中的定义顺序,调用对象成员调用对象成员的构造函数的构造函数,完成对象完成对象成员成员的初始化。的初始化。(2)按照数据成员在组合类中的定义顺序按照数据成员在组合类中的定义顺序,对成员初始化表中对成员初始化表中各数据成员初始化。各数据成员初始化。(3)最后执行组合类构造函数的函数体。最后执行组合类构造函数的函数体。5.5 类的静态成员27当一个类的各对象需要共享数据当一个类的各对象需要共享数据,可以在类定义中用关键字可以在类定义中用关键字static将该数据说明为将该数据说明为静态静态数据成员。这样静态数据成员在内存只存储一份
22、数据成员。这样静态数据成员在内存只存储一份,被该类的所有对被该类的所有对象所共享。因此象所共享。因此一般用一般用类名来引用类的静态成员。类名来引用类的静态成员。5.5.1 静态数据成员5.5 类的静态成员28对静态数据成员再说明两点对静态数据成员再说明两点:(1)对静态数据使用前对静态数据使用前,必须要在类外进行定义性说明必须要在类外进行定义性说明,格式如下格式如下:(2)任何对象的释放任何对象的释放,都不影响静态数据成员生存期。静态数据成员是在程序开始都不影响静态数据成员生存期。静态数据成员是在程序开始运行时运行时获得内存获得内存,程序结束运行时释放内存。但其作用域仅限于定义该类的作用域程序
23、结束运行时释放内存。但其作用域仅限于定义该类的作用域。5.5.1 静态数据成员5.6 常对象与常成员29如果在声明一个引用时如果在声明一个引用时用用const修饰修饰,被声明的引用就是常引用。常引用所引用的被声明的引用就是常引用。常引用所引用的对象对象不能被更新。常引用的定义语法为不能被更新。常引用的定义语法为:5.6.1 常引用5.6 常对象与常成员30如果在声明一个引用时如果在声明一个引用时用用const修饰修饰,被声明的引用就是常引用。常引用所引用的被声明的引用就是常引用。常引用所引用的对象对象不能被更新。常引用的定义语法为不能被更新。常引用的定义语法为:5.6.2 常对象5.6 常对象
24、与常成员31使用使用const说明说明的数据成员称为常数据成员。常数据成员的定义与一般常变量的的数据成员称为常数据成员。常数据成员的定义与一般常变量的定义方定义方法法相同。相同。常数据成员只能通过构造函数的成员初始化表进行初始化常数据成员只能通过构造函数的成员初始化表进行初始化,此后在对象的生存期中此后在对象的生存期中不能不能再作任何更改。再作任何更改。常数据成员定义的格式如下常数据成员定义的格式如下:5.6.3 常数据成员5.6 常对象与常成员32在类中在类中用用const关键字关键字修饰的函数修饰的函数,称为常成员函数称为常成员函数。常成员函数的声明格式如下常成员函数的声明格式如下:5.6
25、.4 常成员函数5.7 类的友元33在类中用在类中用关键字关键字friend修饰修饰一个函数的声明一个函数的声明,该函数就成为这个类的友元函数。友该函数就成为这个类的友元函数。友元函元函数数可以是一个普通函数可以是一个普通函数,也可以是其他类的成员函数。也可以是其他类的成员函数。友元函数在类中的声明语法格式为友元函数在类中的声明语法格式为:5.7.1 友元函数5.7 类的友元34友元可以是函数友元可以是函数,还可以是类。可以将一个类声明为另一个类的友元类。例如将还可以是类。可以将一个类声明为另一个类的友元类。例如将B类类声明为声明为A类的类的友元类。这样友元类。这样B类类的所有成员函数的所有成
26、员函数都是都是A类的类的友元函数友元函数,在在B类类的成员的成员函数函数中中,可以通过可以通过A类类对象对象访问访问A类的类的所有成员。通常将友元类设计为一种对数据操作或所有成员。通常将友元类设计为一种对数据操作或类之间类之间传传递消息的辅助类。递消息的辅助类。5.7.2 友元类5.7 类的友元35关于友元关系关于友元关系,还有以下性质还有以下性质:5.7.2 友元类(1)友元关系是不友元关系是不传递的。的。(2)友元关系是友元关系是单向的。向的。(3)友元关系是不被友元关系是不被继承的。承的。5.8 类应用实例公司人员管理程序36从从20世纪世纪70年代到年代到90年代年代,出现了大批面向对
27、象的程序设计语言出现了大批面向对象的程序设计语言,同时出现了同时出现了大批面大批面向对象向对象的建模语言。这些建模语言功能类似的建模语言。这些建模语言功能类似,但在表述上存在差异但在表述上存在差异,给软件的交流带来给软件的交流带来困难困难。于是于是OMG(ObjectManagementGroup)经过多年努力经过多年努力,于于2003年年建立了统一建模建立了统一建模语言语言(UML)。UML语言语言的主要内容是使用各种图符描述软件模型的静态结构、动态行为和模块的主要内容是使用各种图符描述软件模型的静态结构、动态行为和模块组组织织与管理。本节仅介绍类与对象的与管理。本节仅介绍类与对象的UML图
28、形图形描述以及它们之间的静态关系。对描述以及它们之间的静态关系。对UML感感兴趣兴趣的读者可以参考相关书籍的读者可以参考相关书籍,了解更多了解更多UML语言语言的内容。的内容。5.8.1 UML简介5.8 类应用实例公司人员管理程序371.类类在在UML语言语言中中,用一个由上到下分为三部分的矩形来表示一个类。类名在顶部区域用一个由上到下分为三部分的矩形来表示一个类。类名在顶部区域,数据数据成员成员(UML中称为中称为属性属性)在中间区域在中间区域,成员函数成员函数(UML中称为中称为操作操作)在底部区域。在底部区域。除了名除了名称称部分外部分外,其他两个部分是可选的其他两个部分是可选的,即类
29、的属性和操作可以不表示出来即类的属性和操作可以不表示出来,也就是说也就是说,一个一个写了写了类名的矩形就代表一个类。类名的矩形就代表一个类。5.8.2 UML类图5.8 类应用实例公司人员管理程序385.8.2 UML类图5.8 类应用实例公司人员管理程序39UML规定规定数据成员表示的语法为数据成员表示的语法为:5.8.2 UML类图5.8 类应用实例公司人员管理程序402.对象对象在在UML语言语言中中,用一个矩形来表示一个对象用一个矩形来表示一个对象,在图中的上部区域在图中的上部区域,写对象名写对象名:类名类名,并加并加下划线。数据成员和成员函数在下部区域。下划线。数据成员和成员函数在下部区域。5.8.2 UML类图5.8 类应用实例公司人员管理程序415.8.3 类的设计THANKS