c++ 期末复习.ppt_第1页
c++ 期末复习.ppt_第2页
c++ 期末复习.ppt_第3页
c++ 期末复习.ppt_第4页
c++ 期末复习.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计C 复习 不知道怎么复习 别着急 让我来帮你 C 语言真难学 也不清楚考试的难度 真 死人了 急 第一部分基本知识 C 的语句 类与对象 程序结构 基本概念 继承与多态 基本概念 数据类型 基本数据类型 布尔型bool字符型char整型int short long unsigned实型float double longdouble非基本数据类型 数组type 指针type 空类型void结构struct联合union枚举enum类class说明 标准数据类型由系统给出 用户在程序中可以直接使用 除标准类型之外 其它类型要由用户自己定义 定义类型的格式 TYPE 基本概念 标识符 常量 变量 表达式 标识符 由字母和数字组成 以字母开头 常量 在程序执行过程中 其值不变的量 变量 在程序执行过程中 其值可变的量 要求所有的变量必须先说明后使用 变量说明 表达式 表达式由常量 变量 函数 各种类型的运算符及括号组成 运算顺序 按运算符优先级15个等级排序 如括号 一目 算术 位移 关系 逻辑 条件 赋值 逗号 基本概念 运算符和运算顺序 主要运算符 1 算术运算符 负 2 关系运算符 3 逻辑运算符 4 位运算符 5 条件运算符 6 赋值运算符 7 增量运算符 运算顺序 按运算符优先级15个等级排序 如括号 一目 算术 位移 关系 逻辑 条件 赋值 逗号 C与C 语言的语句 1 简单语句 1 表达式语句 2 函数调用语句 3 块语句 4 空语句2 控制语句 1 if语句 2 switch语句 3 while语句 4 dowhile语句 5 for语句 6 break语句 7 continue语句 8 return语句 9 goto语句 基本概念 C 的输入输出 源程序开始应使用 include或 includeusingnamespacestd 输入 cin v1 v2 vn 功能 输入n项数据输出 cout p1 p2 pn 功能 输出n项的值注意 输出项可以是常量 变量 函数 字符串或表达式 C 中的串类型 字符数组 字符串 是程序设计中经常用到的数据类型 C 专门有一个库 string h 来支持有关字符串的操作 字符串可以用来表示名字 地址等文字性的信息 String类型 引用 1 引用是一种数据形式 使用场合有引用变量 引用参数 引用函数返回值等 引用最大的作用就是作为函数的参数与返回值 引用作为函数参数 有以下好处 引用参数传递的就是实在参数本身 而不是实在参数的一个副本 这样减少了建立副本的消耗 引用作为参数还可以作为函数返回值的一种有效途径 可以通过将引用定义为是const引用来限制在函数中对引用所代表的实在参数做修改 引用 2 引用作为返回值 有以下好处 函数返回的是所返回的变量或对象本身 而不需要建立临时的对象 这样减少了程序运行的开销 返回一个引用使得一个函数调用的表达式可以成为一个左值表达式 可以为其赋值 引用 3 引用的作用和指针类似 但是它摆脱了使用指针可能带来的程序错误 也提高了程序的可读性和可理解性 推荐在能使用引用的地方尽量不要用指针 在函数中通过申请堆空间再通过指针或引用返回的方法不提倡使用 应通过定义类 借助于类的封装机制来改善程序结构 类 1 类是实现C 面向对象程序设计的基础 理解类的含义 定义和使用方式是本课程的重中之重 前面学习的各个内容都将融合到类定义的各个部分 都是为类的讲解而准备的 1 类封装了操作和数据 用函数来实现类的操作成员 用各种数据类型表示类的数据成员 2 一个纯粹的面向对象的程序就是由若干类的定义组成 构成程序的各个文件就是用于定义各个类 头文件就是类的定义文件 6 类 2 类学习的难点有 首先是思想观念的转变 要从传统的面向过程的思想中摆脱出来 用面向对象的观点来分析问题 要将程序看成就是由一个个对象组成的 程序设计的过程就是设计这些类并设计如何以及何时产生这些类的对象的过程 类 3 成员的访问控制 要理解访问控制的含义 私有成员只能由类自己的成员函数访问 保护成员只能由类自己的成员函数和其派生类的成员函数访问 公有函数可以通过类的实例 对象访问 公有成员反映了类对象可以提供的服务或是对外呈现的行为 是对象可以发挥其作用的窗口 类 4 保护和私有成员的目的有二 一是保护隐私 不对外公布类对象的内部结构 二是使类的内部实现独立于对外的接口 外界只需要知道该类对象可以提供哪些服务并用它 而不必要了解复杂的内部实现 减少了程序员的负担 也便于代码的维护 提高稳定性 保护成员又为其派生类提供了可以访问其部分具体细节的权利 为派生类提供了一定的开放空间 类 5 这三种访问级别提供了灵活的成员访问控制 存取方式基类的成员在派生类中的访问控制又受继承类型的限制 如下图所示 存取方式publicprotectedprivate继承类型publicpublicprotected不可见protectedprotectedprotected不可见privateprivateprivate不可见 类 6 格式特殊 使用方式特殊 发挥的作用也比较特殊 从定义格式要求讲 构造函数和析构函数都没有返回值 都必须定义为公有成员函数 如果仅仅作为某些类的基类而不实例化 则可以定义为保护成员函数 析构函数还不能有参数 可以定义多个构造函数 但析构函数只能定义一个 构造函数的名字与类名相同 析构函数的名字是符号 加上类的名字 类 7 从使用方式讲 构造函数在类的对象生成时由系统自动调用 析构函数在类的对象消亡时由系统自动调用 需要注意的是 用new创建的以及系统在进入对象的作用域自动创建的对象也自动调用构造函数 对应的对象释放机制也类似 用delete释放用new创建的对象以及系统自动为退出作用域的对象将会自动调用析构函数 类 8 构造函数的重载为对象的生成提供了各种灵活的手段 其中缺省构造函数和拷贝构造函数又比较特殊 缺省构造函数在构造一个具有默认特征的对象或者在构造一组同样的对象时非常有用 而当用一个对象构造另一个对象 或者类对象作为函数参数和返回值时 需要使用拷贝构造函数 类 9 构造函数的成员初始化表非常重要 该表为类的对象成员 常量成员 引用成员 基类提供了初始化的机会 也是唯一的机会 类 10 在构造类对象时 首先为其各个数据成员分配空间 然后调用其各个成员对象的构造函数 最后才调用类自身的构造函数 成员对象的构造在类对象构造的前面进行 成员对象构造函数的参数由类的初始化参数表传递 在析构类对象时 首先调用类的析构函数 然后才调用各成员对象的析构函数 类 11 在定义派生类的构造函数时 先调用基类的构造函数 然后再构造派生类本身 析构时则顺序相反 当有多个基类时 需要按照一定顺序依次激活这些基类的构造函数 类是C 面向对象编程语言最重要的一部分 把封装起来的数据和处理数据的代码称为类 类是一个用户自定义的类型 类的定义如下 class标识符 private 私有数据成员 私有成员函数 protected 保护数据成员 保护成员函数 public 公有数据成员 公有成员函数 类 12 对象 定义了一个类后 不能对类的成员进行操作 如同不能对int型进行操作一样 要使用类必须先声明类的对象 类的对象是具有该类类型的某一具体的实例 如果将类看作是自定义的类型 那么类的对象可看成是该类型的变量 声明某个类的对象的与声明一般变量类似 声明格式如下 类名类对象名 例如 PointB 声明了一个点类的对象B声明了类及其对象 可以访问对象的公有成员 对对象的成员进行访问时可以用访问运算符 其一般形式是 用构造函数初始化对象的过程 实际上就是对构造函数的调用过程 一般情况下按如下步骤进行 1 程序执行到定义对象语句时 系统为对象分配内存空间 2 系统自动调用构造函数 将实参传送给形参 执行构造函数体时 将形参值赋给对象的数据成员 完成数据成员的初始化工作 3 默认的构造函数每个类必须有一个构造函数 没有构造函数 就不能创建任何对象 若未提供一个类的构造函数 一个都未提供 则C 提供一个默认的构造函数 该默认构造函数是个无参构造函数 它仅负责创建对象 而不做任何初始化工作 只要一个类定义了一个构造函数 不一定是无参构造函数 C 就不再提供默认的构造函数 也就是说 如果为类定义了一个带参数的构造函数 还想要无参构造函数 则必须自己定义 4 带参数的构造函数前面介绍的构造函数若不能完全满足初始化的要求 则可以定义带参数的构造函数 否则 往往程序员只能先将对象构造成千篇一律的对象值 甚至一个随机值对象 然后再调用一个初始化成员函数将数据存到该对象中去 5 拷贝构造函数用类定义对象中 可用带拷贝功能的构造函数将另一个已经存在对象的数据拷贝到新建的对象中 拷贝构造函数是一种特殊的构造函数 其名称与类名称相同 1 拷贝构造函数的特征 拷贝构造函数除了具有一般构造函数的特征外 其形参必须是本类的对象的引用 2 拷贝构造函数的作用 其作用是使用一个已存在的对象去初始化一个新的同类对象 某函数的形参是类的对象 调用该函数需要拷贝构造函数进行形参和实参结合 函数的返回值是类的对象 函数调用返回的时候需要调用拷贝构造函数实现类对象的赋值 如果用户没有声明类的拷贝构造函数 系统会自动生成一个缺省的拷贝构造函数 这个缺省的拷贝构造函数的功能是把初始化对象的每个数据成员的值都复制到新建的对象中 也可以说是同类对象的克隆 3 拷贝构造函数的实现 类名 类名 类名 对象名 拷贝构造函数 函数体 4 拷贝构造函数被调用的三种情况 用类的对象去初始化类的另一个对象的时候 voidmain void LocationA 1 2 LocationB A cout B GetX endl 如果函数的形参是类的对象 调用该函数进行形参和实参结合的时候 voidfun LocationP cout p GetX endl voidmain LocationA 1 2 fun A 函数的返值是类的对象 函数调用完成返回的时候 Locationfun LocationA 1 2 returnA voidmain LocationB B fun 析构函数 析构函数与构造函数的作用几乎正好相反 它用来完成对象被删除前的一些清理工作 析构函数也是类的一个公有函数成员 和构造函数一样 析构函数必须与该类同名称 它的名称由类名前面加 构成 析构函数的其他性质如同构造函数 不能有返回值 不允许声明返回值类型 特别不同于构造函数的是析构函数不能有任何参数 且一个类只允许有惟一的一个析构函数 也就是不能重载 析构函数的调用分两种情况 1 用类直接建立对象在程序执行过程中 当遇到对象的生命期结束时 系统自动调用析构函数 然后回收为对象所分配的存储空间 2 用new运算符动态生成对象对于用New运算符动态生成的对象 在产生对象时调用构造函数 只有用delete释放对象时 才调用析构函数 若不使用delete运算符来撤销动态生成的对象 程序结束时对象仍存在 并占用相应的存储空间 即系统不能自动撤销动态生成的对象 与默认的构造函数一样 若在类的定义中没有显式地定义析构函数 则编译器自动地产生一个默认的析构函数 其格式为 默认的析构函数的函数体为空 即该默认的析构函数什么也不执行 实际上 任何对象都有构造函数和析构函数 在定义类时 若没有定义构造函数或析构函数 则编译器自动产生默认的构造函数与析构函数 当产生对象时 若不对数据成员进行初始化 可以不显式地定义构造函数 在撤销对象时 若不做任何结束工作 可以不显式地定义析构函数 但在撤销对象时 要释放对象的数据成员用new运算符分配的动态空间时 必须显式定义析构函数 this指针 用类定义一个对象时 由系统自动建立指向该对象的指针称为this指针 this指针的默认定义格式 constthis 对象 this指针的特性 1 this是每个成员函数的一个隐含参数 通过该参数 成员函数可以获知当前对象的地址 从而可以操纵对象所拥有的数据成员 2 由于this指针是作为隐含参数传递给成员函数的 所以通常成员函数是以隐含方式使用该指针来访问本类的数据成员的 3 this指针具有变量和常量的双重特征 当一个对象调用本类的成员函数时 this指针作为常量实参被传递 在函数体内固定指向该对象 常量特征 如果另一对象再调用成员函数时 该this指针必须重新定向 变量特征 4 在某些场合需要显式地使用this指针来操作调用成员函数的对象 类 12 静态成员 静态成员独立于具体的类对象而存在 是从属于类的属性 静态成员变量一般用于以下几种情形 1 用来保存该类对象的个数 2 用来管理该类的各个对象共享的一些资源 如各个对象都从同一空间分配 或者各个对象使用同一文件资源等 3 在链表类中 指向链表节点的指针 类的每个对象是链表中的一个节点 静态成员函数则用来对这些静态成员变量操作 如返回对象个数 查找链表中的某一节点 或者判断某一共享文件是否被某一对象使用等 类 13 静态成员函数与一般成员函数的不同点有 定义方式不同 加static 使用限制不同 静态成员函数只能访问静态成员变量 调用方式不同 用classname staticFunc 来调用 而根本的区别在于静态成员函数没有this指针 所以它不能访问属于某个具体对象的数据成员 静态成员的使用可以消除破坏封装性的全局变量 为真正面向对象程序设计提供了必要手段 类 15 友元友元本身是破坏封装性的 但是又有其现实背景和必要性 它将类的内部实现对一部分类或者函数公开 就象一个人的秘密有时候不能对家人讲 却可以告诉好朋友一样 使用友元的主要目的是提高程序效率 方便编程 在重载插入和析取操作符时 一般定义成友元函数 以便可以方便地存取内部的数据成员 继承 1 继承是面向对象程序设计的关键 它带来的好处非常多 最重要的是 1 抽取对象类之间的共同点 消除冗余 仅仅用处于同一层次的类来构建软件是不可取的 实际上很多类之间都存在共同点 忽略这些共同点将会带来很大的冗余 2 继承带来了软件的复用 用已经实现的类为基类 派生出新的类 可以做到 站在巨人的肩膀上 能快速开发出高质量的程序 抽象类包含纯虚函数的类称为抽象类 由于抽象类包含了没有定义的纯虚函数 所以不能定义抽象类的对象 继承 2 继承虽然有三种方式 但一般是公有继承 私有和保护继承基本上没有什么实际用途 多继承和单继承都非常有用 但是由于实现的复杂性 多继承在有些编译器中不支持 可以采用一定的补偿方法来模拟多继承 多继承会带来二义性问题 可以用虚拟继承来解决 在继承路径上 所有通过虚拟继承的同一基类不管被间接继承多少次 该虚基类在派生类中都只有一份 派生类中成员的访问权限 继承方式有三种public protected private四条规则 1 无论哪种方式 基类中的私有成员在派生类中都是不可直接访问成员 2 在公有继承时 基类中的公有和保护成员在派生类中不发生变化 3 在保护继承时 基类中的公有和保护成员在派生类中都成为保护成员 4 在私有继承时 基类中的公有和保护成员在派生类中都成为私有成员 派生类中不会继承基类中的构造函数和析构函数 在C 中 定义派生类的一般语法为 class 声明中的 基类名 是已有的类的名称 派生类名 是继承原有类的特性而生成的新类的名称 在派生过程中 派生出来的新类也可作为基类来继续派生新的类 此外 一个基类可以同时派生出多个派生类 也就是说 一个类从父类继承来的特征也可以被其他新的类所继承 一个父类的特征 可以同时被多个子类继承 派生类的构造函数与析构函数 1 构造函数派生类的构造函数需要以合适的初值作为参数 隐含调用基类和新增对象成员的构造函数 来初始化它们各自的数据成员 然后加入新的语句对新增普通数据成员进行初始化 派生类构造函数的一般语法规则为 形参表 实参表1 实参表n 派生类新增成员的初始化 如果基类定义了带有形参表的构造函数时 派生类就应当定义构造函数 提供一个将参数传递给基类构造函数的途径 保证在基类进行初始化时能够获得必要的数据 如果基类没有定义构造函数 派生类也可以不定义构造函数 全部采用默认的构造函数 这时新增成员的初始化工作可以用其他公有成员函数来完成 调用基类构造函数 调用内嵌成员对象的构造函数 调用顺序按照它们在类中定义的顺序 派生类自己的构造函数 单继承时 派生类构造函数调用的一般次序如下 当派生类对象析构时 各析构函数的调用顺序正好相反 首先调用派生类析构函数 清理派生类新增成员 然后调用派生类成员对象析构函数 清理派生类新增的成员对象 最后调用基类析构函数 清理从基类继承来的基类子对象 类型兼容是指在公有派生的情况下 一个派生类对象可以作为基类的对象来使用 类型兼容又称为类型赋值兼容或类型适应 在C 中 类型兼容主要指以下三种情况 派生类对象可以赋值给基类对象 派生类对象可以初始化基类的引用 派生类对象的地址可以赋给指向基类的指针 多继承 multipleinheritance MI 是指派生类具有两个或两个以上的直接基类 directclass 多继承时派生类构造函数执行的一般次序如下 调用各基类构造函数 各基类构造函数调用顺序按照基类被继承时声明的顺序 从左向右依次进行 调用内嵌成员对象的构造函数 成员对象的构造函数调用顺序按照它们在类中定义的顺序依次进行 调用派生类的构造函数 由于多继承中派生类拥有多个基类 如果多个基类中拥有同名的成员 那么 派生类在继承各个基类的成员之后 当我们调用该派生类成员时 由于该成员标识符不唯一 出现二义性 编译器无法确定到底应该选择派生类中的哪一个成员 这种由于多继承而引起的对类的某个成员访问出现不唯一的情况就称为二义性问题 通常有两种方法可以解决二意性问题 1 成员名限定通过类的作用域分辨符明确限定出现歧义的成员是继承自哪一个基类 例如 使用Car show 与Wagon show 来表明调用哪个类的show 2 成员重定义在派生类中新增一个与基类中成员相同的成员 由于同名覆盖 程序将自动选择派生类新增的成员 可以对派生类StationWagon的ShowSW 改名为show 这样 类StationWagon中的show 覆盖了基类中的两个同名的show 使用SW show 时不会出现二义性问题 运算符重载 1 使用运算符重载 可以使程序易于理解 并且易于对对象进行操作 几乎所有的C 运算符都可以被重载 但是不能定义新的运算符 重载不改变运算符的优先级和执行顺序 也不能改变操作数的数据个数 运算符重载 2 重载时 以对象作为参数 一般定义为引用 但什么时候该返回引用 什么时候该返回值 与具体的运算符和使用方式相关 后缀 后缀 等返回的一般是临时对象 前缀 前缀 等返回的一般是引用 类型转换运算符不需要说明返回类型 因为操作符名本身就是返回类型 Static的含义 static的含义 用的地方含义全局变量该变量和或函数的作用域仅仅是定义它和函数们的文件 函数内的变量的生存期和程序的生存期一样 局部变量并且只有一个实例 在退出函数时能保持值 但作用域仍在定义它的函数里 类的静态从属于类的特性 生命期和程序一样 成员和变作用域仍在类中 与具体对象无关 量 虚函数和多态性 1 C 中 允许用指向基类的指针来指向子类的对象 当用该指针来访问类继承层次中定义的虚拟函数时 系统可以根据该指针实际指向的对象类型来调用该对象的相应函数 这就是多态性 虚函数和多态性 2 多态性的表现形式是 接受同一消息的不同对象可以有不同的反应 发送消息的程序不需要知道谁是具体的消息接受者 多态性也是面向对象程序设计的好处之一 它简化了程序 带来了程序的可扩展性和可维护性 虚函数和多态性 3 虚函数的实现是通过滞后联编 或动态联编 实现的 在程序运行时动态地根据对象的实际类型来调用该对象的成员函数 与之对应的是静态联编 没有说明为虚拟的成员函数和一般函数都是在编译时就静态确定了的 虚函数和多态性 4 纯虚函数就是没有实现体的函数 使用纯虚函数的类称为虚基类 虚基类的存在为其派生类提供了许多可重定义的公共接口 为它们提供了统一的访问接口 虚函数和多态性 5 派生类必须为每个纯虚函数给出定义 虚拟析构函数是一种特殊的虚函数 它为类继承层次中类对象的正确析构提供了可靠的保证 静态成员函数 内联函数和构造函数不能是虚函数 内存管理 1 系统为每个程序建立一虚拟的内存空间 这一空间可以分为划分为三个区域 1 代码与数据区 用于存放程序代码和预先需要分配空间的数据 如全局变量 静态变量 2 栈区 由系统保留使用 组织的方式和栈一样 遵循后进先出的规则 用语存放程序的临时状态数据 如进行函数调用时存放返回地址 传递的参数以及局部变量等 这些空间在退出函数作用域时将会释放 内存管理 2 3 堆 也称自由存储区 程序运行期间由程序员动态申请的空间在堆中分配 如用new或malloc分配的空间 这些空间需要程序员显式地用delete或free释放并归还给堆 内存管理 3 需要注意的是 堆栈的大小一般是有限制的 如果在程序中使用了递归函数 尤其要保证递归的深度不要太深 递归的结束条件要能保证递归结束 程序中可以使用的堆空间也是有限的 在编制程序时需要时刻牢记 及时释放没有用的堆空间 否则 随着程序的运行 内存会越来越小 最后可能导致系统无法正常运行 内存管理 4 在堆中分配与释放空间一般有两种方法 1 malloc和free 2 new和delete 前者是C语言中使用的 后者是C 语言中提供的内存分配与回收机制 两者不同之处在于 malloc直接在堆中找到满足所要大小的一段空间 返回这一空间的首地址供使用 而new不仅仅完成空间的分配 还执行一定的初始化工作 如调用对象的构造函数 在用delete释放一个对象时 会自动调用对象的析构函数 delete运算符的作用delete运算符用来将动态分配的内存空间归还给系统 delete运算符的定义格式 1 格式1 delete 该语句的作用是将指针变量所指的内存空间归还给系统 如 deletepi 将由指针变量pi所指内存空间归还给系统 内存管理 5 2 格

温馨提示

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

评论

0/150

提交评论