ITjob就业培训中心C语言课程PPT第一章类和对象.ppt_第1页
ITjob就业培训中心C语言课程PPT第一章类和对象.ppt_第2页
ITjob就业培训中心C语言课程PPT第一章类和对象.ppt_第3页
ITjob就业培训中心C语言课程PPT第一章类和对象.ppt_第4页
ITjob就业培训中心C语言课程PPT第一章类和对象.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

第一章类和对象 理解类和对象的基本概念理解面向对象抽象和封装 信息隐藏两大特性熟练掌握类的定义和使用深刻理解构造函数和析构函数功能并掌握各种特殊构造函数的定义和用理解对象和相关常量的作用以及相关用法理解并掌握静态成员的作用和用法理解并掌握友元相关概念和用法 学习目标 类的概念 客观世界中的一切事物都可以视为对象 当然这些事物既有具体的物理实体 如 电视 电脑 洗衣机等 也可以是逻辑实体 如 部门 气候等 不管是哪一种对象他们都有两方面的特征 静态特征和动态特征 所谓对象的静态特征就是能描述对象的一些属性 如一个部门的人数 经理名字等 所谓动态特征就是对象表现出来的行为 比如部门例会 财务汇报和人员出差等 当把一些具有共性的对象归类后形成一个集合 抽象 对事物共性的归纳和集中 也就是所谓的类 所以我们可以这样来描述类和对象之间的关系 类是对象的抽象 对象是累的实例 类的定义方式 类定义的一般形式为class类名 private 私有成员数据 属性 私有成员函数 方法 protected 保护成员数据 属性 保护成员函数 方法 public 公有成员数据 属性 保护成员函数 方法 对比类和结构体 类是由结构体进化而来 除了关键字使用class外类和结构体还有以下区别 1 class除了对成员变量管理外还新增了成员函数 struct不可以有成员函数 2 class新增了权限管理 struct连public的关键字也不能识别 3 class新增的友元是对成员变量的开辟一种特殊的权限 4 class新增了静态成员变量 当然函数也有静态成员函数 struct对于静态和成员变量都支持 以上区别是针对C编译器中的结构体的对比 实际上 类和结构体在C 编译器中几乎完全一样 只有成员缺省权限不同 struct缺省是公有权限 class缺省是私有权限 成员权限的管理 class对成员提供依次从小到大的3种权限管理 private权限 限制成员在类内被调用 相当于直系关系 protected权限 限制成员在派生类内和本类内被调用 相当于亲属或者有血缘关系 public权限 不限制被调用的位置 在任何全局函数或者其他类中 都可以被调用 相当于同事或者朋友关系 3种权限管理的作用域 都是管理关键字以下的部分成员 缺省权限 class在不指定权限时 缺省是私有权限 使用成员函数 成员函数的定义 成员函数可以在类的内部定义 成员函数也可以定义在类外部 但必须通过类名和定义域 来表明该函数属于哪个类 通常的成员函数 定义在类内 在头文件中声明类和类的成员函数 而成员函数的定义则写在源文件中 成员函数的调用 跟成员变量一样 类成员函数使用 和 符号来调用 成员变量的生命期 其实成员变量的有效期跟结构体是一样的 只要对象没销毁 成员变量一直有效 类的演示 includeusingnamespacestd classCtest private intm iCount protected boolm bFlag public voidPublicFun cout m iCount endl intmain Ctesttest test m iCount 私有成员只能在本类内部访问 test m bFlag 保护成员只能在本类内部和该类的派生类中访问test PublicFun 公有成员可以在类的外部访问 也可以在类的内部访问return0 类的演示 includeusingnamespacestd classCTest private intm iCount protected boolm bFlag public voidPublicFun 类外定义成员函数voidCTest PublicFun cout m iCount endl intmain CTesttest test PublicFun return0 解析成员函数原理 this指针就是隐含的成员函数的原理 早期C语言多个对象处理 例如 分别用两个指针记录2个以上链表对象时 通常使用函数的参数来区分 例如 SNode g pHead1 g pHead2 voidAddHead SNode pHead DATAdata 当实参代入g pHead1时代表向第1条链表加入1个节点 代入g pHead2时代表向第2条链表加入1个节点 而C 使用类成员函数中隐含的this就等价于以上的pHead形参 例如 CListlist1 list2 定义了2个C 类对象 List1 AddHead data 将 This指针的使用 成员函数可以直接调用成员变量的原因 是隐含的使用了this指针 例如 voidCList AddHead DATAdata SNode pNew newSNode pNew pNext m pHead 等价于this m pHead m pHead pNew 等价于this m pHead 当局部变量与成员变量重名 使用this表示成员变量 当全局变量与成员变量重名 使用 表示全局变量 构造函数 构造函数是类的一种特殊成员函数 一般情况下 构造函数是专门用来初始化对象成员变量的 所以最好不要在构造函数中进行与对象的初始化无关的操作 构造函数在类实例化对象时自动执行 构造函数的名字必须与类名同名 它不具有任何类型 不返回任何值 即使是void也不允许 C语言中对结构体初始化使用 structSStudentstu 1002 张山 而如果定义了一个类后 则禁止以上方式进行 CListlist 0 是错误的 使用构造函数 构造函数分为无参数 有参数和拷贝构造函数 定义了哪形式的构造函数 就意味着类有哪种对象定义方式 无参数构造 当定义了无参数构造函数 对应类对象的定义也是无参数的 例如 CTesttest 有参数构造 定义了有参数构造函数 在定义类对象时就要对应代入对应的实参 例如 CTesttest 23 拷贝构造函数 拷贝构造函数是一种特殊的构造函数 定义类对象时代入的实参是相同类型的另一个变量 固定格式 CTest constCTest 初始化成员列表 在构造函数中 除了可以在函数体中为成员变量赋值外 还可以在初始化列表中对成员变量赋值 初始化成员列表的形式为 构造函数名 构造函数参数列表 成员1 参数列表1 成员2 参数列表2 成员n 参数表n 在以下情况下必须使用初始化列表 成员变量是const类型 成员变量是有参的类对象 基类的构造函数是有参的 析构函数 对象的生命期结束时 会自动调用析构函数 析构函数名是在类名前加 析构函数同样不能返回任何值 也没有函数参数 并且不能被重载 所以一个类可以有多个构造函数 却只能有一个析构函数 一般说来 每当创建一个对象时就调用对象的构造函数 每当撤消一个对象就调用该对象的析构函数 具体有以下4种情况 对于全局定义的对象 每当程序开始运行 在主函数main 或WinMain 接受程序控制权之前 就调用全局对象的构造函数 整个程序结束时调用析构函数 对于局部定义的对象 每当程序流程到达该对象的定义处就调用构造函数 在程序离开局部变量的作用域时调用对象的析构函数 对于关键字static定义的局部变量 当程序流程第一次到达该对象定义处调用构造函数 在整个程序结束时调用析构函数 对于用new运算符创建的对象 每当创建该对象时调用构造函数 当用delete删除该对象时 调用析构函数 对象和常量 常对象 常对象指在任何场合都不能对其成员的值进行修改的对象 定义常对象的形式为 const类名对象名 参数列表 或者类名const对象名 参数列表 常数据成员 将对象的数据成员声明为const 则为常对象成员 常对象成员只能在构造函数的初始化成员列表中对其进行初始化 参见初始化成员列表一节 常成员函数 常成员函数不能修改类中的成员数据 常成员函数的声明形式为 返回类型函数名 const 类的静态成员 在面向过程程序设计中 数绝共享主要是通过全局变量来实现的 虽然全局变量引入能够实现数据共享 但是使得变量的值贬得难以跟踪和调试 在面向过陈哥程序设计中 虽然提倡数据的封装和信息隐藏 但有时候也需要在对象间实现数据的共享 类的静态成员变量的引入使得这一目的得以实现 静态数据成员为类的所有对象共享 即在内存中只有一份空间 静态数据成员的生存期为整个程序运行期 静态数据成员必须在类体外进行初始化 静态成员的通常用类名 静态成员名的形式访问类的另外一种静态成员就是静态成员函数 静态成员函数的引入是为了访问类的成员变量 而且只能访问类的静态数据成员 静态成员的通常用类名 静态成员函数名的形式调用 友元 前面章节讲过 当把一个的成员的访问属性设置成为非公有属性后 是不能从类的外部访问的 但是有的时候 我们需要某个函数或者类也能够访问这些非公有成员 在C 中有这样的机制使得这一愿望得以实现 这就是友元机制 有以下三种友元 友元函数如果希望一个普通函数Func中能够访问类CTest中的非公有成员 可以在类CTest中声明普通函数Func为该类CTest的友元 即Func是类CTest的友元函数 友元成员函数如果希望类CTest2的成员函数CTest2Func可以访问类CTest1的非公有成员 可以在类CTest1中将类CTest2的成员函数CTest2Func声明为友元 友元类如果希望类CTest2的所有成员函数都可以访问类CTest1的非公有成员 可以在类CTest1中将整个类CTest2声明为友元 注意 友元关系是单向 非传递的 结构化方法中开发大规模的复杂软件时 其固有的问题就表现出来了维护过于困难过于僵硬 扩展困难重用率过低 导致大量冗余耦合度过高 导致理解 修改困难一个好的系统应该具备如下的性质 可扩展性 灵活性 可插入性 PeterCode CODE99 传统开发方法中存在的问题 对象概念概述对象 Object 一个具有明确行为的有形实体 具有行为和状态 有着清晰的边界 我们将对象所有特点 属性 称之为对象的状态 而动作称之为行为 属性 Attribute 对象的一种内在的或独特的性质 特点 质量或特征 它构成了一个独一无二的对象 行为 Behavior 是一个对象根据它的状态改变和消息传送所采取的行动和作出的反应 代表了对象对外的可见 可测试的动作 面向对象的概念 在软件中 对象的定义 对象代表一个单独的 可确认的实体 可以是具体的也可以是抽象的 必须有明确定义的一个这样的角色 相似对象的属性和行为在它们的共同类中定义 面向对象的概念 类概念概述类 Class 是一组共享公共属性结构和公共行为的对象的集合 类可以是一种抽象 即不是具体存在的 它实际上是对一组对象的公共部分的归纳集合 而对象却是一个具体的存在 是实体而非抽象 面向对象的概念 抽象 Abstraction 封装 Encapsulation 继承 Inheritance 多态 Polymorphism 面向对象的一些主要优点 和现实世界更接近 更符合我们人类的思维逻辑开发出的系统容易维护和修改适用于开发复杂 庞大的系统开发出的程序更稳定合理由于继承 类的机制 更容易实现重用 减少冗余由于实现数据和逻辑的分离 维护和扩展变得更加容易 面向对象的主要特性 面向对象分析 Object OrientedAnalysis OOA定义 是一种分析方法 它以可在问题域的词汇表中找到的类和对象的观点来理解 审视需求 OOA就是仔细的划分系统的各个部分 明确它们之间的层次关系 然后将各个部分作为一个对象进行功能上的分析的一个过程 包括业务分析和需求分析 面向对象的分析 设计和编程 OOD与OOA的区别OOA偏重于理解问题 描述软件要做什么 而OOD偏重于理解解决方案 描述软件要如何做 OOA只考虑理想的设计 不关心技术与实现底层的细节 而OOD需要得到更具体详细更接近于真实的代码的设计方案 在设计结果的描述上 OOA偏重于描述对象的行为 OOD偏重于描述对象的属性与方法 OOA只关注功能性需求 OOD还需要关注非功能性需求 面向对象的分析 设计和编程 面向对象编程 Object OrientedProgramming OOP定义 是一种实现方法 程序被组织成对象的协作集合 每一个对象代表某一个类的实例 而类则是通过继承关系联系在一起的 OOP阶段必须满足三个标准条件 使用对象而不是算法 面向过程则是使用算法 作为其基本逻辑构件 任何一个对象都必须是某一个类的实例 类通过继承关系和其它类相关 面向对象的分析 设计和编程 近50年的历史 其中 产生了四代计算机语言 第一代 1954 1958 FortranI ALCOL58 Flowmatic等语言 主要应用于数学和工程应用 几乎全部使用数学词汇 第二代 1959 1961 FortranII ALCOL60 COBOL Lisp等语言 重点在于算法抽象 集中于告诉机器应该做什么 比如通过这些语言编写的算法会告诉机器应该在查看员工数据之前进行排序 第三代 1962 1970 PL 1 FORTAN ALCOL COBOL Pascal Simula 最早出现类和对象的思想的语言 对数据 类 抽象 描述各种类的类型 第四代 1970 至今 Smalltalk C Ada Java Eiffel PHP等语言 都是面向对象或基于对象的语言 面向对象语言的发展简史 C 改进 1 C 特征 类的特征 抽象 封装 继承和多态 2 面向对象设计 OOA OOD OOP 3 C 的改进 1 cout和cin 比C语言输入输出优点在自动识别类型 书写更流畅 2 new和delete 比C语言的malloc书写更直观更方便 a 在堆申请一个数组空间指针类型指针变量 new类型 变量或常量 delete 指针变量 b 申请单个类型的变量的空间 指针类型指针变量 new类型 delete指针变量 C 改进 c 申请单个类型的变量的空间 同时执行构造 指针类型指针变量 new类型 变量或常量 delete指针变量 2 系统头文件多数不带 h 为了避免跟其他头文件重名 3 定义域 2个冒号就是定义域 不指定类名时 代表全局变量 4 命名空间 为了避免跟其他函数或者类重名 5当使用using之后 有跟系统或者其他函数相同函数 发生二意性 为了区别2种函数 可以在前面加 域名 代表区域内的函数 如果要表示不在空间内的全局函数 使用空的定义域 5 标准C 包含STL模板库 ListVectormapiostream C 改进 函数调用中传递参数的引用函数可以访问主调程序中的实际变量 将多个值从被调函数返回到主调函数的实参 大的数据结构按引用传递 效率非常高功效近似指针做参数 但书写更加方便voidswap int 返回值引用通过返回值可以修改该函数返回的内存变量 返回的内存变量不可以是临时变量 声明期较长 返回类对象 this 用于连续操作 函数的默认参数 函数调用时 可以不指定的参数提供默认值 一旦给一个参数赋了默认值 后续所有参数也都必须有默认值 默认值可以在原型或者函数定义中给出 但不能在两个位置同时给出推荐在原型声明中指定默认值voiderrfunc intnum1 2 intnum2 charch 错误调用上面声明的函数func func 2 13 func 1 第二个和第三个参数采用默认值func 2 25 第三个参数

温馨提示

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

评论

0/150

提交评论