资源预览内容
第1页 / 共132页
第2页 / 共132页
第3页 / 共132页
第4页 / 共132页
第5页 / 共132页
第6页 / 共132页
第7页 / 共132页
第8页 / 共132页
第9页 / 共132页
第10页 / 共132页
亲,该文档总共132页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C 面向对象程序设计 第2版 第2章 C 类和对象 2 1 面向对象程序设计方法概述 2 1 1 面向对象程序设计方法的基本概念 1 对象 对象是人们进行研究的任何事物 从最简单 的整数到复杂的飞机等均可看作对象 它是构 成系统的基本单位 它不仅能表示具体的事物 还能表示抽象的 规则 计划或事件 2 1 面向对象程序设计方法概述 2 1 1 面向对象程序设计方法的基本概念 1 对象 由于在自然界 任何一个客体都具有两个要 素 属性和行为 因此一个对象往往是由一组属性和一组行为 共同描述的 对象的每个属性都具有属性值 它们结合在 一起反映对象的状态 2 类 具有相同属性和行为的对象的抽象就是 类 因此 类是对象的抽象 对象是类的实 例 类也具有属性 它是类中所有对象的属 性抽象 用数据成员来描述类的属性 类同时也具有行为 它是类中所有对象 的行为抽象 用成员函数来描述类的行 为 2 类 例如 可以把一类具有相同属性和相同 行为的学生对象抽象成一个 学生类 那 么该类的属性就是类中每个对象都具有 的属性 如学号 姓名 性别 成绩等 该类的行为就是类中每个对象都具有的 行为 如选课 考试 查询成绩等 每一个学生对象都是 学生类 的一个实 例 2 类 客观世界蕴含了无数多个类 其中有一 部分类彼此之间存在一定的关系 一种是一般与特殊的关系 比如交通工 具类和汽车类 另一种是整体与部分的关系 比如订单 类和商品类 前者是一种 属于 关系 而 后者是一种 拥有 关系 3 方法和消息 类中行为的实现过程即类的方法 也是类 的成员函数 一个方法具有方法名 即函数名 返回 值类型 参数表 方法体 即函数体 对象之间需要相互沟通 沟通的途径就是 向对象发送消息 当向对象发送一条消息时 程序语句至少 要包括接收消息的对象名 对象需执行的 行为的名称 即方法名 往往还要提供 调用方法所需的参数 2 1 2 面对象程序设计方法的基本原理 1 抽象 抽象是从众多的事物中抽取出共同的 本质的特征 例如可以把苹果 香蕉 生梨 葡萄 桃子等食物归纳为 水果 类 这个过 程是抽象 而抽象的角度又取决于分析 问题的目的 抽象是简化复杂问题的途径 它可以 为具体问题找到最恰当的类定义 2 1 2 面对象程序设计方法的基本原理 1 抽象 在对类的抽象过程中 往往需要忽略 与设计目标无关的方面 以便更充分地 注意与设计目标相关的方面 例如 在设计一个学生成绩管理系统 的过程中 考察学生张三这个对象时 只关心他的姓名 学号 成绩等与成绩 管理相关的属性 而忽略他的身高 体 重等与成绩管理无关的属性 2 封装 封装就是把对象的属性和行为结合成 一个独立的单位 并尽可能隐蔽对象 的内部细节 封装有两层含义 一是把对象的全部属性和行为结合在 一起 形成一个不可分割的独立单位 对象的属性值只能由这个对象的行 为来读取和修改 二是在对象的内部与外界之间形成一 道屏障 内部与外部的联系只能通过 外部接口实现 2 封装 在面向对象程序设计领域中 封装使 对象以外的部分不能随意存取对象的 内部属性 从而有效地避免了外界的 误操作所带来的影响 大大减小了查 错和排错的难度 当对象内部进行修改时 只要对外的 接口不改变 任何封装体内部的改变 都不会对外部造成影响 封装的结果实际上隐藏了内部的复杂 性 支持了代码的可重用性 从而降 低了软件开发和维护的难度 3 继承 假设已经定义了一个雇员类 标记为 它拥有属性 姓名 编号 级别 薪酬 以及行为 计算薪酬 晋升 现在准备定义一个兼职雇员类 标记为 类 不仅拥有类 的所有属性和行为 而 且它自身还拥有一些新的属性 每小时薪 酬 当月工作时数 以及新的行为 记录工 作时数 计算薪酬 其中计算薪酬的实现 细节与类 不同 3 继承 基于以上分析 类 显然不必完全重新去 定义 而只需在类 的基础上增加 的新 属性和新行为 这就是面向对象设计方法中的继承原理 让类 继承类 的属性和行为 最大程度 地重用类 的代码 以此来提高程序开发 的效率 继承具有传递性 体现了大自然中一般与 特殊的关系 在软件开发过程中 继承实现了软件模块 的可重用性 缩短了开发周期 同时使软 件易于维护和修改 例如 如果要为雇员类和兼职雇员类新增 一个相同的属性 那么只需在雇员类中添 加 而兼职雇员类继承它就好了 4 多态性 Polymorphism 在日常生活中 往往一种称谓可能对 应多种不同的实现方式 这是生活中 多态性的一种体现 面向对象设计方法借鉴了客观世界的 多态性 当不同的对象收到相同的 消息时 可能会以不同的行为实现来 响应消息 4 多态性 Polymorphism 例如 在一般类 几何图形 中定义了一个行 为 计算面积 而特殊类 圆 和 长方形 都 继承致几何图形类 拥有 计算面积 这一行 为 但其中蕴含的实现细节却不同 一个是要根据半径值和圆周率来计算 另一个则是要计算长边与宽边的乘积 当接收同一个 求面积 的消息时 圆对象和 长方形对象却执行不同的实现过程 这就是面向对象程序设计领域中的多态性 的一种表现 程序世界中的另一种多态性是函数重载 2 2 类和对象 2 2 1 类的定义 将对象的属性抽象为数据成员 行为抽象为成员函 数 并对它们进行封装 由此就形成了类 类的定义格式一般分为声明部分和实现部分 声明部分是用来声明该类的成员 包含数据成员和 成员函数 所谓成员函数的声明 就是只声明成员函数的函数 原型 而成员函数的实现则是对成员函数进行定义 概括地说 声明部分讲的是 能干什么 而实现部分讲的是 怎 么干 类的一般定义格式如下 class public private 花括号内是类的声明部分 包含描述 属性的数据成员和定义行为的成员函 数的函数原型 数据成员一般被列为私有成员 因为 类的数据必须是封装的 成员函数一般被声明为公有成员 因 为它们提供对外界的操作接口 便于 外界访问和使用相应的功能 关键字public private和protected被 称为访问控制符 用来说明类成员的 访问权限 其中 是类的实 现部分 即类中声明的成员函数的代码实现 例2 1 日期类的定义 include 编译预处理命令 using namespace std 使用命名空间std class Date public void SetDate int y int m int d 日期类的行为 设置当前日期的年月日 year y month m day d int IsLeapYear 日期类的行为 判断当前日期是否属于闰年 return year 4 0 void Print 日期类的行为 输出当前日期的年月日 cout year 年 month 月 day 日 private int year 声明日期类的属性 年 int month 声明日期类的属性 月 int day 声明日期类的属性 日 文件路径名 s2 1 smain2 1 cpp include sclass2 1 date h int main void Date d1 d1 SetDate 2012 11 11 d1 Print cout 此年是闰年吗 d1 IsLeapYear endl return 0 程序的运行结果 2012年11月11日此年是闰年吗 1 2 2 2 成员函数的实现 类的核心是成员函数 而成员函数的 核心则是算法 因此 算法的程序实现就是成员函数 的实现 也叫做 类的实现 它是操纵被封装的数据成员的途径 2 2 2 成员函数的实现 成员函数的实现一般有两种方式 一种是类内实现 另一种是类外实现 在例2 1中 Date类的每一个成员函数在声明时就 定义了实现代码 这种形式就叫成员函数在类内 实现 系统会将这些成员函数默认为内联函数 那么 什么是类外实现呢 简单地说 就是把成员函数的实现代码放到类外 去 这样一来 类的声明部分就只包含数据成员的声 明和成员函数原型的声明了 例如 可以把前面Date类的声明精简如下 class Date public void SetDate int y int m int d 成员函数 SetDate的声明 int IsLeapYear 成员函数IsLeapYear的声明 void Print 成员函数Print的声明 private 以下是数据成员的声明 int year int month int day 建议把类的声明部分放到一个头文件 扩展名为 h 中 而实现部分放在一个源文件 扩展名 为 cpp 里 比如把精简后的Date类声明放在一个 名为Date h的头文件里 作为Date类的 声明文件 而把Date类所有成员函数的实现放到 一个名为Date cpp的源文件里 作为 Date类的实现文件 代码如下所示 void Date SetDate int y int m int d year y month m day d int Date IsLeapYear return year 4 0 void Date Print cout year 年 month 月 day 日 这里出现的作用域运算符 是用来标识成员函数属于哪个类的 2 2 3 对象的创建 对象是类的实例 语法格式如下 类名 对象名 如果类的构造函数有参数 那么创建对 象时还需提供实参 例如 在定义了Date类之后 可以通过 以下代码来创建一个名为newDate的日期 对象 Date newDate 2 2 3 对象的创建 也可以在一行代码中创建多个对象 Date newDate1 newDate2 newDate3 那么创建对象的代码应该写在哪里呢 写在main 函数里 因为它是程序执行的 入口 建议把main 函数专门存放在一个源文 件 扩展名为 cpp 中 作为可执行的主 文件 2 2 3 类成员的访问 1 类成员的一般访问形式 当建立一个普通对象时 可以通过对象名 和句点符号去访问类的公有成员 相关的 语法格式如下 对象名 数据成员名 访问数据成员 对象名 成员函数名 参数表 访问成员函数 2 类成员的访问权限 面向对象程序设计的一个重要特性就 是数据保护 为此 C 专门设置了三种类成员的 访问控制符 分别代表三种访问权限 它们是public private和protected 2 类成员的访问权限 public 代表公有的访问权限 它修饰了类对外界公开的部分 凡是 由关键字public声明的成员 被称为公 有成员 类外允许访问 对于Date类来说 从类外能直接访问 的公有成员有SetDate IsLeapYear Print 这3个成员函数 2 类成员的访问权限 private 代表私有的访问权限 它规 定了只能被类内部的成员函数访问的 部分 而来自类外的任何访问都是非 法的 关键字private就像一道屏障 把它所 修饰的成员与外界隔开 实现数据隐 藏 在最大程度上保护了类的私有数 据 在Date类中 year month day都是 该类的私有成员 protected 代表保护的访问权限 它与私有的访问权限类似 区别仅在 于派生类中的访问属性不同 保护权限的成员可以被所在类的派生 类成员函数访问 而这一点对于私有成员来说是非法的 类在声明它的成员时 不同访问权限的成 员可以按任意顺序出现 但私有成员在类的最前面声明 可以省略 关键字private 因为它是缺省的访问控制 符 请注意 类的成员函数可以访问类中的所有成员 没有任何限制 而由类创建的对象就不同了 对象往往在 类以外的地方比如main函数中被创建 因 此它是类外的部分 当它去访问本类成员 时将受到访问控制符的限制 不能访问类 中的私有成员和保护成员 例2 2 类成员的访问 编译预处理语句 如果未定义 SCLASS2 2 CDEMO H 则定义它 直到遇到 endif结束 ifndef SCLASS2 2 CDEMO H define SCLASS2 2 CDEMO H include using n
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号