c++面向对象程序设计

上传人:美景 文档编号:3024 上传时间:2016-09-20 格式:PPT 页数:407 大小:1.16MB
返回 下载 相关 举报
c++面向对象程序设计_第1页
第1页 / 共407页
c++面向对象程序设计_第2页
第2页 / 共407页
c++面向对象程序设计_第3页
第3页 / 共407页
点击查看更多>>
资源描述
面向对象的设计思想 面向对象的思想最初出现于挪威奥斯陆大学和挪威计算机中心共同研制的 7语言中 , 随着的0语言推出 , 面向对象的的程序设计方法得到了比较完善的实现 。 此后 , 面向对象的概念和应用已超越了程序设计和软件开发 , 扩展到如数据库系统 , 交互式界面 , 分布式系统 , 网络管理结构和人工智能等领域 。 面向对象的发展 面向对象思想 数据抽象 一种设计方法 把一组数据及作用与其上的操作组成一个设计实体或单位。接口说明外部可见,其实现是隐蔽的,不可见的。 发展的三个阶段 01010101 100100 用户 定义 抽象数 据类型 面向对象思想 抽象数据类型 抽象数据类型是指“一个值集和作用在该值集上的操作集”。抽象数据类型的定义只决定于其逻辑特性,与其具体的计算机内部实现无关。一个抽象数据类型可以分解为语法、语义、表示和算法 4个部分。 功能抽象 模块 数据抽象 模块 面向对象思想 抽象数据类型的实现 实现抽象数据类型需要借助于高级程序设计语言 ; 在面向过程的语言中,用户可以自己定义数据类型 ; 在面向对象的程序设计语言中,借助于对象描述抽象数据类型。 (面向对象思想 问题求解 面向对象设计方法:实现问题空间和问题求解空间的近似和直接模拟。 意识部分 教室 物质部分 303教室 抽象部分 教室类 具体部分 一个对象:教室实例 现实问题空间 解空间 面向对象的特点 封装机制 基于消息的通信 继承机制 多态机制 理解面向对象的基本概念对于学习和掌握面向对象的开发方法是十分重要的。 面向对象的基本概念 类 ( 对象 (实例 (多态性 (继承 ( 消息 (封装 (面向对象的世界观 把客观世界从概念上看成是一个由相互配合而协作的对象所组成的系统 面向对象 =对象 +分类 +继承 +通信 一个实例 椅子 对象:桌子 价格 尺寸 重量 位置 颜色 类:家具 对象:椅子 一个面向对象的实例 椅子 价格 尺寸 重量 位置 颜色 买 卖 移动 买 卖 移动 买 卖 移动 价格 尺寸 重量 位置 颜色 对象 对象 (对象是用来描述客观存在的事物,它是构成系统的基本单位,是对客观世界中事物的抽象描述。 对象 行为(功能、方法、服务) 属性(数据) 属性 行为 接口 对象 对象 对象 面向对象的基本概念 对象是由私有数据(属性)及作用于其上的一组操作(行为)所构成的一个封闭整体 由于对象的数据是私有的,所以要想访问其数据的正确方法是向该对象发送消息,让对象自身选择其内部相应的操作以完成对该项数据的访问 对象的动作取决于外界给对象的刺激,这就是消息,消息告诉对象所要求它完成的功能。对象具有一定的智能功能,即“知道”如何选择相应的操作来处理对象所接收的消息 从设计人员的角度看,对象是一个完成特定功能的程序块 从用户的角度看,对象为他们提供了所希望的行为 面向对象的基本概念 对象 (对象标识 对象生命周期 面向对象的基本概念 类 ( 类 又称 对象类 ( , 是 一组具有相同属性和相同操作的对象的集合 。 在一个类中 , 每个对象都是类的 实例 (,它们都可以使用类中提供的函数 。 类具有属性 , 用数据结构来描述类的属性 , 类具有操作 , 它是对象的行为的抽象 , 操作实现的过程称为方法 ( , 方法有方法名 , 方法体和参数 。 由于对象是类的实例,在进行分析和设计时,通常把注意力集中在类上,而不是具体的对象上。 几何对象 颜色 位置 移动( 矢量) 选择( P:指针型) :布尔型 旋转 (角度 ) 图 1 对象类的描述 人 姓 名 :字符串 年 龄 : 整 型 改换工作 改换地址 文件 文件名 文件大小 最近更新日期 打印 (人 ) 张红兵 28 绘图员 人民路 8号 (人 ) 李军 24 程序员 无 图 2 对象的描述 对象和类的描述 类和 对象一般采用 “ 名字 ” 、 属性 ” 和 运算 ” 来描述 。 类名 属性 运算 对象 类 属于某类的具体对象就是该类的 实例 。 一个类的不同实例必定具有: 相同的操作(或行为)的集合 相同的信息结构或属性定义,但可以有不同的属性值 不同的对象标识 面向对象的基本概念 面向对象的基本概念 消息 (对象之间的联系是通过传递消息来实现的。 消息 就是向对象发出的服务请求(互相联系、协同工作等)。 是对象之间进行通讯的一种数据结构。 消息统一了“数据流”和“控制流”。 数据 方法 消息到达 面向对象的基本概念 消息 - 消息传送与函数调用的区别 ( 1)函数调用可以带或不带参数,但是消息至少带一个参数,它表明接收该消息的对象,消息中告诉对象做什么的部分称为消息操作; ( 2)消息操作名类似于函数名,其本质区别在于:函数名代表一段可执行的代码,但消息操作名具体功能的选定还取决于接收消息的对象本身 ( 3)函数调用是过程式的(如何做),消息传送是说明式的(做什么),具体如何做,由对象根据收到的消息自行确定。 继承 ( 继承是使用现存的定义作为基础 , 建立新定义的技术 。 是父类和子类之间共享数据结构和方法的机制 ,这是类之间的一种关系 。 继承性分: 单重继承: 一个子类只有一个父类 。 即子类只继承一个父类的数据结构和方法 。 多重继承: 一个子类可有多个父类 。 继承多个父类的数据结构和方法 。 基类 子类 A 子类 B 图 4 继承性描述 现存类定义 父类 (基类 ) 新类定义 子类 (派生类 ) 继 承 图 3 继承性 继承 单继承 c c o u n b a la n n a m n u m b e r+ w i th d r a w ( )+ cr ea ta te m e n t( )继承 多继承 Fl y i n g T h i n g A n im a lH o r s eW o i r dH e li c o p t e rA i r p la n 装 (封装是一种信息隐蔽技术 , 就是把对象的属性和行为相结合构成一个独立的基本单位 , 用户只能见到对象封装界面上的信息 ,对象内部对用户是隐蔽的 。 封装的目的在于将对象的使用者和对象的设计者分开 , 使用者不必知道行为实现的细节 , 只需使用设计者提供的消息访问对象 面向对象的基本概念 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。 面向对象的基本概念 公有消息 私有消息 存储结构 方法 协.议 一个对象 面向对象的基本概念 封装的定义为: (1)一个限定所有对象内部软件的一个清楚界面; (2)一个描述这个对象和其它对象之间相互作用的接口 (3)受保护的内部实现,这个实现给出了由软件对象提供的功能细节,实现细节不能在定义这个对象的类的外面访问 封装 承 矛盾吗? 封装性主要指的是对象的封装性,引入继承机制后,对象仍然是封装地很好的实体,其它对象与它通信只能发送消息。 相似性:共享代码! 继承:静态共享代码 封装:动态共享代码 面向对象的基本概念 多态 (即一个 名字具有多种语义 。 同一对象接收到不同消息采用不同的行为方式 不同对象收到相同消息时产生不同的动作 重载( 动态绑定 类属 多态性和动态绑定 多态性 (指相同的操作或函数 、过程作用于不同的对象上并获得不同的结果 。 即相同的操作的消息发送给不同的对象时 , 每个对象将根据自己所属类中定义的操作去执行 , 产生不同的结果 。 例如: “ 绘图 ” 操作 , 作用在 “ 椭圆 ” 和 “ 矩形 ” 上 , 画出不同的图形 。 动态绑定 (在运行时根据对象接收的消息动态地确定要连接的服务代码 。 使用虚函数可实现动态联编 , 不同联编可以选择不同的实现 , 这便是多态性 。 继承是动态联编的基础 , 虚函数是动态联编的关键 。 多态性的实现举例 实现多态性的基本步骤 (以 C+为例 ): (1)在基类中 , 定义成员函数为虚函数 ( (2)定义基类的公有 ( 派生类; (3)在基类的公有派生类中 “ 重载 ” 该虚函数; (4)定义指向基类的指针变量 , 它指向基类的公有派生类的对象 。 注意: 重载虚函数不是一般的重载函数 , 它要求函数名 、 返回类型 、 参数个数 、 参数类型和顺序完全相同 。 多态 类与对象 C+语言程序设计 C+语言程序设计 本章主要内容 面向对象的思想 类概念和声明 对象 构造函数 析构函数 内联成员函数 拷贝构造函数 类的组合 C+语言程序设计 回顾:面向过程的设计方法 重点 : 如何实现细节过程,将数据与函数分开。 形式: 主模块 +若干个子模块( +子函数)。 特点: 自顶向下,逐步求精 功能分解。 缺点: 效率低,程序的可重用性差。 面向对象的思想 C+语言程序设计 面向对象的方法 目的: 实现软件设计的产业化。 观点 :解决问题属于自然界的。 自然界是由实体(对象)所组成。 程序设计方法: 使用面向对象的观点来描述模仿并处理现实问题。 要求: 高度概括、分类、和抽象。 面向对象的思想 C+语言程序设计 ( 1)抽象 抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。(如学生,教师 , 课程) 先注意问题的本质及描述,其次是实现过程或细节。 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 行为抽象:描述某类对象的共有的行为特征或具有的功能。 抽象的实现:通过类的声明。 +语言程序设计 抽象实例 钟表 数据抽象: 行为抽象: , +语言程序设计 抽象实例 钟表类 ; ; +语言程序设计 抽象实例 人 数据抽象: 行为抽象: 生物属性角度: , , 社会属性角度: , , 注意:同一个问题可能有不同的抽象结果:根据解决问题的要求不同,产生的抽象成员可能不同 +语言程序设计 (2) 封装 将抽象出的数据成员、行为成员相结合,将它们视为一个整体,即类。 目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。 实现封装:类声明中的 +语言程序设计 封装 实例: ; ; 边界 特定的访问权限 部接口 C+语言程序设计 ( 3)继承与派生 为了重用引出了继函的概念。 是 C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。 实现:声明派生类 第 11章 昆虫的分类树 +语言程序设计 多态性 多态:同一名称,不同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。 实现:重载函数和虚函数 第 12章 +语言程序设计 c+中的类 类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。 利用类可以实现数据的封装、隐藏、继承与派生。 利用类易于编写大型复杂程序,其模块化程度比 类 和 对 象 C+语言程序设计 类与函数 函数是将逻辑上相关的 语句与数据 封装,用于完成特定的功能。 而类则是逻辑上相关的 函数与数据 的封装,它是对所要处理的问题的描述。 类 和 对 象 C+语言程序设计 类的声明形式 类是一种用户自定义类型,声明形式: 名称 公有成员(外部接口) 私有成员 保护型成员 类 和 对 象 C+语言程序设计 公有类型成员 在关键字 们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。 类 和 对 象 C+语言程序设计 私有类型成员 在关键字 允许本类中的函数访问,而类外部的任何函数都不能访问。 如果紧跟在类名称的后面声明私有成员,则关键字 类 和 对 象 C+语言程序设计 保护类型 与 差别表现在继承与派生时对派生类的影响不同, 第七章讲 。 类 和 对 象 C+语言程序设计 类的成员 ; ; 类 和 对 象 成员数据 成员函数 : : ; ; C+语言程序设计 x,y; a,b) x=a; y=b; xx, ; /. ,; ; 构造函数和析构函数 xx, X= Y= /.41 C+语言程序设计 # x,y; Q(a=0,b=0) I = 35; 20; /声明类 其数据和方法 r); /构造函数 ; /圆周长 ; /圆面积 ; 43 / 类的实现 / 构造函数初始化数据成员 r) r / 计算圆的周长 * / 计算圆的面积 I * 44 ) / 提示用户输入半径 / 声明 象 3); 45 / 计算栅栏造价并输出 * # r,i) r; t; t= t); ; a; # r,i) r; t; t= t); ; a( # r=0.0,i= r; t; t= t); ; a( b; c( # r,i) r; t; t= t); ; a( # r=0.0,i= r; # r=0.0,i= r; c) # r=0.0,i= r; c) # r=0.0,i= r; c) , ) X=Y=; p); ; ; f(); g(); ; =0; f() ; g() , ) X=yy; p); /拷贝构造函数 ; ; ) i; /声明 i i; /取 i=10; / ai; ai; ai; 相当于 (*; 指 针 C+语言程序设计 对象指针应用举例 (5,10); A; x; x=; =指 针 C+语言程序设计 指针变量作为函数实参 以地址方式传递数据,可以用来返回函数处理结果。 例如: 指针与函数 C+语言程序设计 例 * * C+语言程序设计 动态申请内存操作符 类型名 T(初值列表) 功能: 在程序执行期间,申请用于存放 依初值列表赋以初值。 结果值: 成功: 向新分配的内存。失败: 0( 动态存储分配 C+语言程序设计 释放内存操作符 针 P 功能: 释放指针 动态存储分配 C+语言程序设计 i ; / is ; / i = 0; i i ; / i=0; i X=Y=0; /类的声明同上例,略 ; ; /创建对象数组 ,10); /通过指针访问数组元素的成员 5,20); /通过指针访问数组元素的成员 / / (a) ; / (b) j = 0; j b; b0) c; . 具有块作用域的变量也称为局部变量。 作用域与可见性 C+语言程序设计 类作用域 可以将类看成是一组有名成员的集合,除个别例外情况外,类作用域作用于特定的成员名,类及其对象有特殊的访问和作用域规则。 例:类 , 在 的函数成员中都可以访问到 M, ( 1)即 ( 2)这样的 类的封装作用就在于限制数据的作用域。 作用域与可见性 C+语言程序设计 类作用域 通过表达式 :这是程序中访问对象成员的最基本的方法。 X: 通过表达式 , 其中 作用域与可见性 C+语言程序设计 命名空间作用域 一个大型的程序通常由不同模块构成,不同的模块甚至有可能是由不同人员开发的。不同模块中的类和函数之间有可能发生重名,这样就会引发错误。如南京路(上海的、武汉的) 作用域与可见性 C+语言程序设计 命名空间的语法形式: 名空间名 命名空间内的各种声明(函数声明、类声明、 ) 一个命名空间确定了一个命名空间作用域,凡是在该命名空间之内声明的、不属于前面所述各个作用域的标识符都属于该命名空间作用域。在命名空间内部可以直接引用当命名空间中声明的标识符,如果需要引用其他命名空间的标识符,需要使用下面的语法: 命名空间名 :标识符名 作用域与可见性 C+语言程序设计 例: ); ; /声明一个作用域与可见性 命名空间作用域 C+语言程序设计 有时,在标识符前总使用这样的命名空间限定会显得过于冗长,为了解决这一问题, C+又提供了 名空间名 :标识符名; 名空间名; C+标准程序库的所有标识符都被声明在 此都使用了 如果去掉这条语句,则引用相应的标识符需要使用 作用域与可见性 命名空间作用域 C+语言程序设计 命名空间也允许嵌套,如: ; 引用其中的 要使用 作用域与可见性 命名空间作用域 C+语言程序设计 两类特殊的命名空间 全局命名空间 匿名命名空间 全局命名空间是默认的命名空间,在显式声明的命名空间之外声明的标识符都在一个全局命名空间中(文件作用域)。 匿名命名空间是一个需要显式声明的没有名字的命名空间,声明方式如下: 匿名命名空间内的各种声明(函数声明、类声明、 ) 作用域与可见性 C+语言程序设计 在包含多个源文件的工程中,匿名命名空间常常被用来屏蔽不希望暴露给其他源文件的标识符,这是因为每个源文件的匿名命名空间是彼此不同的,在一个源文件中没有办法访问其他源文件的匿名命名空间。例: 作用域与可见性 命名空间作用域 C+语言程序设计 # i; /在全局命名空间的全局变量 (又称文件作用域 ) s j; /在 i=5; /为全局变量 j=6; /为全局变量 s; /使得当前块中可以直接引用 名空间的标识符 i; /局部变量 i=7; i; /文件作用域 j=3; i=5; i; /块作用域 i=7; i=5; /文件作用域 k=3; ; ; ; a=1; i=5; a+; i+; ;/构造函数 /三个形参均具有函数原型作用域 ; /析构函数 ; 对象的生存期 /时钟类成员函数实现 /构造函数 ; ; ; f() ; g() r); d( d); ; r) /常引用做形参,在函数中不能更新 R(R1=2= ; 1, ; : A(i); ; r; a; b; /静态常数据成员 ; :b=10; A:A(i):a(i),r(a) : 按标准方式搜索,文件位于 C+系统目录的 #件名 首先在当前目录中搜索,若没有,再按标准方式搜索。 #定义指令 定义符号常量,很多情况下已被 定义带参数宏,已被内联函数取代。 # 删除由 #之不再起作用。 C+语言程序设计 条件编译指令 # # #常量表达式 /当“ 常量表达式”非零时编译 程序正文 # . 编译预处理命令 C+语言程序设计 条件编译指令 # # 常量表达式 /当“ 常量表达式”非零时编译 程序正文 1 # /当“ 常量表达式”为零时编译 程序正文 2 #译预处理命令 C+语言程序设计 条件编译指令 # # 常量表达式 1 程序正文 1 /当“ 常量表达式 1”非零时编译 #常量表达式 2 程序正文 2 /当“ 常量表达式 2”非零时编译 # 程序正文 3 /其它情况下编译 #译预处理命令 C+语言程序设计 条件编译指令 # 标识符 程序段 1 # 程序段 2 #如果“标识符”经 #未经 编译程序段 1,否则编译程序段 2。 编译预处理命令 C+语言程序设计 条件编译指令 # 标识符 程序段 1 # 程序段 2 #如果“标识符”未被定义过,则编译程序段 1,否则编译程序段 2。 编译预处理命令 C+语言程序设计 多文件结构 一个源程序可以划分为多个源文件: 类声明文件( 类实现文件( 类的使用文件( 所在的 利用工程来组合各个文件。 C+语言程序设计 不使用条件编译的头文件 / # # / # / # / 多文件结构 C+语言程序设计 使用条件编译的头文件 / # #
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 休闲娱乐


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!