cc++04(类与对象)_第1页
cc++04(类与对象)_第2页
cc++04(类与对象)_第3页
cc++04(类与对象)_第4页
cc++04(类与对象)_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1 第四章类与对象 C 语言程序设计 清华大学计算机与信息管理中心郑莉 作业 2 本章主要内容 面向对象的思想OOP的基本特点类的概念和定义对象构造函数 析构函数内联成员函数拷贝构造函数类的聚集 3 回顾 面向过程的设计方法 着眼点 功能的实现 数据与代码分离 形式 主模块main 子模块 其它函数 数据作为模块间的连接手段 特点 自顶向下 逐步求精 功能分解 缺点 抽象层次低 程序的可复用性差 面向对象的思想 4 面向对象的方法 目的 提高程序的抽象层次和可复用性 实现软件的产业化设计 观点 将世上事物抽象为彼此相关 并能相互通信的一批实体 对象 每个对象具有静态和动态方面的若干属性 静态属性可用数据来描述 动态属性用代码来描述 面向对象的思想 5 面向对象的方法 程序设计方法 使用面向对象的观点来描述并处理现实问题 设计类 对象的生成模板 相当于过去的数据类型 描述对象的各个属性 将数据与代码封装捆绑到了一起 实现了数据的隐藏 定义对象 相当于过去的定义变量 对象之间的相互作用 发送消息 接收消息 引发行为要求 在分类和抽象的基础上对事物进行高度概括 面向对象的思想 6 抽象 抽象 对具体对象 问题 进行概括 提取某类对象的共同属性 用计算机手段加以描述 先注意问题的本质及描述 其次是实现过程或细节 数据抽象 描述某类对象的静态属性 代码抽象 描述某类对象的动态行为属性 抽象的过程 通过类的定义实现 OOP的基本特点 7 抽象实例 钟表 数据抽象 intHour时intMinute分intSecond秒代码抽象 SetTime 可进行时间设置ShowTime 可进行时间显示 OOP的基本特点 8 抽象实例 钟表类 classclock private 私有 可缺省intHour Minute Second public 公有voidSetTime intNewH intNewM intNewS voidShowTime OOP的基本特点 9 抽象实例 人 数据抽象 char name char sex intage intid代码抽象 生物属性角度 GetCloth Eat Step 社会属性角度 Work Promote OOP的基本特点 奖励 10 封装 将抽象出的数据成员 代码成员封装为一个整体 封装的实现 类的描述 一对 增强数据的安全性 简化编程 使用者不必了解具体的内部实现细节通过外部接口和特定的访问权限 来访问类的各个成员 OOP的基本特点 11 封装 实例 classClock private intHour Minute Second public voidSetTime intNewH intNewM intNewS voidShowTime 封装边界 特定的访问权限 OOP的基本特点 外部接口 12 继承与派生 继承与派生是C 中支持层次分类的一种机制 允许程序员在保持事物原有属性的基础上 对事物进行更具体的刻画 交通工具 飞机 客机物质 有机物 动物 哺乳动物 人实现 类的派生 第七章继承与派生 OOP的基本特点 13 多态 多态 使用同一函数名 来实现不同的功能 目的 统一行为标识 减少程序中标识符的个数 如打牌 打仗 打架 打灯笼 实现 函数重载 实现编译多态运算符重载 实现编译多态虚函数和赋值兼容规则 实现运行多态 第八章多态性 OOP的基本特点 14 c 中的类 类 class 是具有相同属性和行为的一类对象的集合 它为该类的所有对象提供了统一的抽象描述 其内部包括数据和行为两个主要部分 利用类可以实现数据的封装 隐藏 继承与派生 利用类易于编写大型复杂程序 其模块化程度比C中采用函数更高 类和对象 15 类的声明形式 类是用户自定义的一种抽象数据类型 ADT 其定义形式为 class类名 public 公有成员 数据 函数 private 私有成员 数据 函数 protected 保护型成员 数据 函数 类和对象 16 公有类型成员 在关键字public后面声明 任何外部函数都可以访问公有类型的数据和函数 它们是类与外部代码的接口 17 私有类型成员 在关键字private后面声明 只允许本类中的代码 函数 进行访问 而类外部的任何函数都不能访问 如果紧跟在类名称的后面声明私有成员 则关键字private可以省略 18 保护类型 兼有private成员和public成员的特点 可使属性派生到后代 派生到后代的属性不能被外界访问 类似祖传秘方详见第七章继承与派生 19 类的成员 classClock public voidSetTime intNewH intNewM intNewS voidShowTime private intH M S 类和对象 成员数据 成员函数 voidClock SetTime intNewH intNewM intNewS H NewH M NewM S NewS voidClock ShowTime cout H M S endl 21 成员数据 定义成员数据与一般的变量相同 但需要将它放在类的定义中 22 成员函数 成员函数可在类中说明原型 在类外给出函数体的实现 并在函数名前使用类名加以限定 成员函数可直接在类中给出函数体 形成内联成员函数 允许定义重载函数和带缺省形参值的函数 23 内联成员函数 为了提高运行效率 对于较简单的函数可以声明为内联形式 内联函数体中不要有复杂结构 如循环语句和switch语句 在类中声明内联成员函数的方式 将函数体放在类的定义中 使用inline关键字 类和对象 24 内联成员函数举例 1 classPoint intX Y public voidInit intinitX intinitY X initX Y initY intGetX returnX intGetY returnY 类和对象 25 内联成员函数举例 2 classPoint public voidInit intinitX intinitY intGetX intGetY private intX Y 类和对象 inlinevoidPoint Init intinitX intinitY X initX Y initY inlineintPoint GetX returnX inlineintPoint GetY returnY 27 对象 对象是类的实例化 类是对象的生成模板 类相当于 数据 类型 对象相当于变量 定义形式 类名对象名 例 ClockmyClock 类和对象 28 类中成员的访问方式 在类中 成员间互访直接使用成员名在类外对成员进行访问用 对象名 成员名 方式可访问具有public属性的公有成员 类和对象 29 例4 1类的应用举例 includeclassClock 类的声明 略 类的实现 略 voidmain ClockmyClock myClock SetTime 8 30 30 myClock ShowTime 类和对象 30 构造函数 构造函数 创建对象时被调用 对对象进行初始化等操作 在创建对象时系统自动调用构造函数 如果程序中未定义 系统将自动产生出一个缺省形式的构造函数构造函数可以内联 重载 带缺省形参值 构造函数和析构函数 31 构造函数的重载 带参构造函数 带有参数Clock Clock inthh intmm intss H hh M mm S ss 缺省构造函数 无参数Clock Clock H M S 0 拷贝构造函数 参数是同类数据Clock Clock Clock 构造函数和析构函数 32 用户缺省时系统定义的构造函数 系统定义的缺省构造Clock Clock 系统定义的拷贝构造Clock Clock Clock 构造函数和析构函数 33 构造函数举例 classClock intHour Minute Second public 构造函数Clock intNewH intNewM intNewS voidSetTime intNewH intNewM intNewS voidShowTime 构造函数和析构函数 构造函数的实现 Clock Clock intNewH intNewM intNewS H NewH M NewM S NewS 建立对象时构造函数的作用 voidmain Clockc 0 0 0 隐式调构造函数 用实参初始化 c ShowTime 35 拷贝构造函数 拷贝构造函数是一种特殊的构造函数 其形参为本类的对象引用 class类名 public 类名 形参 带参构造函数类名 本类名 形参对象 拷贝构造函数 类名 类名 本类名 形参对象 拷贝构造函数的实现 函数体 构造函数和析构函数 36 例4 2拷贝构造函数举例 classPoint intX Y public Point intxx 0 intyy 0 X xx Y yy Point Point 构造函数和析构函数 Point Point Point 38 系统定义的拷贝构造函数 若程序员没有定义拷贝构造函数 则编译器自己会自动生成一个拷贝构造函数 Point Point Point 缺省构造函数的功能是 用形参对象的数据成员去初始化要创建对象中的相应的数据成员 构造函数和析构函数 39 例4 2拷贝构造函数举例 当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值 voidmain void PointA 1 2 带参构造函数被调用PointB A 拷贝构造函数被调用PointC 缺省构造函数被调用cout B GetX endl 构造函数和析构函数 40 拷贝构造函数举例 例4 2 若函数的形参为类对象 调用函数时 实参对象赋值给形参对象 系统将自动调用拷贝构造函数 例如 voidfun1 Pointp cout p GetX endl voidmain PointA 1 2 调用带参构造函数fun1 A 调用拷贝构造函数 构造函数和析构函数 41 拷贝构造函数举例 例4 2 当函数的返回值是类对象时 系统自动调用拷贝构造函数 例如 Pointfun2 PointA 1 2 调用带参构造函数returnA 调用拷贝构造函数 voidmain PointB 调用缺省构造函数B fun2 调用赋值运算函数 构造函数和析构函数 临时对象 42 析构函数 完成对象被删除前的一些清理工作 在对象的生存期结束的时刻系统自动调用它 然后再释放此对象所属的空间 如果程序中未定义析构函数 编译器将自动产生一个缺省的析构函数 其内容为空 Point Point 构造函数和析构函数 43 构造函数和析构函数举例 includeclassPoint public Point intxx intyy Point 其它函数原形private intX intY 构造函数和析构函数 Point Point intxx intyy X xx Y yy Point Point cout 析构 endl 其它函数的实现略 45 例4 3类的应用举例 一圆型游泳池如图所示 现在需在其周围建一圆型过道 并在其四周围上栅栏 栅栏价格为35元 米 过道造价为20元 平方米 过道宽度为3米 游泳池半径由键盘输入 要求编程计算并输出过道和栅栏的造价 includeconstfloatPI 3 14159 constfloatFencePrice 35 栅栏造价constfloatConcretePrice 20 过道造价 声明类Circle及其数据和方法classCircle private floatradius public Circle floatr 构造函数floatCircumference const 圆周长floatArea const 圆面积 类的实现 构造函数初始化数据成员radiusCircle Circle floatr radius r 计算圆的周长floatCircle Circumference const return2 PI radius 计算圆的面积floatCircle Area const returnPI radius radius 与前对应 与前对应 voidmain floatradius floatFenceCost ConcreteCost 提示用户输入半径cout radius 声明Circle对象CirclePool radius CirclePoolRim radius 3 计算栅栏造价并输出FenceCost PoolRim Circumference FencePrice cout FencingCostis FenceCost endl 计算过道造价并输出ConcreteCost PoolRim Area Pool Area ConcretePrice cout ConcreteCostis ConcreteCost endl 运行结果 Entertheradiusofthepool 10FencingCostis 2858 85ConcreteCostis 4335 39 50 组合的概念 类中的成员数据可以是另一个类的对象 该对象我们称之为内嵌子对象 该类我们称之为聚集类 类的聚集 反映类之间的一种包含关系 可用 有一个 Hasa 来进行描述 如飞机包含 机翼 进一步包含前翼 尾翼 机身和机轮 类的组合 51 举例 classPoint private floatx y 点的坐标public Point floatxx floatyy 构造函数floatGetX void 取X坐标floatGetY void 取Y坐标voidDraw void 在 x y 处画点 函数的实现略 类的组合 classLine private pointp1 p2 线段的两个端点public Line Pointa Pointb 构造函数VoidDraw void 画出线段 函数的实现略 53 类的聚集与类的继承 类的聚集 反映类之间的包含关系可用 有一个 Hasa 来进行描述飞机有一个机身类的继承 反映类之间的进化关系可用 是一个 Isa 来进行描述轰炸机是一种飞机类的关联 反映类之间交互关系 54 类组合的构造函数设计 原则 不仅要负责对本类中的基本类型成员数据赋初值 也要对对象成员初始化 声明形式 类名 类名 对象成员所需形参 本类成员所需形参 内嵌对象1 参数 内嵌对象2 参数 本类初始化 类的组合 初始化表列 55 类组合的构造函数调用 构造函数调用顺序 先调用内嵌对象的构造函数 按内嵌时的声明顺序 先声明者先构造 然后调用本类的构造函数 析构函数的调用顺序相反 若调用缺省构造函数 即无形参的 则内嵌对象的初始化也将调用相应的缺省构造函数 类的组合 56 类的组合举例 2 classPart 部件类 public Part Part inti Part voidPrint private intval 类的组合 classWhole 整体类 public Whole Whole inti intj intk Whole voidPrint private Partone Parttwo intdate Whole Whole date 0 Whole Whole inti intj intk two i one j date k 其它函数的实现略 也可此处加 date k 则函数体为空 初始化表列 59 前向引用声明 类应该先定义 后使用如果需要在某个类的定义之前 引用该类 则应进行前向引用声明 前向引用声明只为程序引入一个标识符 但具体声明在其它地方 60 前向引用声明举例 classB 前向引用声明classA public voidf Bb classB public voidg Aa 61 类模板的定义及用途 使用类模板使用户可以为类声明一种模式 使得类中的某些数据成员 某些成员函数的参数 某些成员函数的返回值 能取任意类型 包括系统预定义的和用户自定义的 例 讲义例4 5 template类声明 类模板 62 例4 4类模板应用举例 include inclu

温馨提示

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

评论

0/150

提交评论