C++面向对象程序涉及复习要点、重点复习.ppt_第1页
C++面向对象程序涉及复习要点、重点复习.ppt_第2页
C++面向对象程序涉及复习要点、重点复习.ppt_第3页
C++面向对象程序涉及复习要点、重点复习.ppt_第4页
C++面向对象程序涉及复习要点、重点复习.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

C+面向对象程序设计复习,2015-1-12,第1章复习要点,简单的C+程序,#include / 用cout输出时需要用 / 此头文件 using namespace std; / 使用命名空间std int main() cout“This is a C+ program.n“; / 用C+的方法输出一行 return 0; ,输入和输出 格式:cout endl表示结束一行 数据类型 const 常量定义 const float PI = 3.14159; 占用存储单元,只读不可写 函数原型声明 格式:函数类型 函数名(参数列表); int max(int x, int y); 要求:函数调用之前必须对所调用的函数作函数原型声明,函数重载 定义(overload) 要求:参数个数或参数类型不同 有默认参数的函数 格式:float area(float r=6.5) 与函数重载的关系,函数模版、函数重载例题,1、对重载函数形参的描述中,错误的是 A. 参数的个数可能不同 B. 参数的类型可能不同 C. 参数的顺序可能不同 D. 参数的个数、类型、顺序都相同,只是函数的返回值类型不同,D,变量的引用* 函数传值与函数传地址 对比引用与指针:P19 例1.10&1.11 内置函数 inline 作用:空间换时间 作用域运算符 :,字符串变量 string 定义,与字符数组的关系 赋值 字符串操作:复制、连接、比较 new和delete运算符,例题,1、对于动态分配内存空间描述正确的是 A使用new运算符分配的内存空间的长度必需是常量 Bdelete运算符可以释放动态的存储空间和静态的存储空间 C由new分配的内存空间是不连续的 Ddelete运算符只能释放由new分配的动态存储空间,D,什么是蓝?,类与对象,类和对象,在C+中,类是一种数据类型。,int x; class student std1;,基本数据类型,用户定义数据类型,变量(实例),对象(实例),1.类的声明与对象的定义 2.类的数据成员与成员函数 3.对象成员的访问 4.构造函数与析构函数 5. Const 6. Static 7. New与delete 8. 拷贝构造函数 9. 友元,第2章 要点复习,基本概念 对象 封装与信息隐蔽 抽象 继承与重用 多态性,声明类类型*,class CGoods private : char Name21 ; int Amount ; float Price ; float Total_value ; public : void CountTotal(void) ; ;,1. class关键字 2. 类名 3. 类体 ; 格式 4. 类数据成员 5. 类成员函数 6. 访问限定符,定义对象的方法 1. 先声明类类型,然后再定义对象 class Student stud1; Student stud1; 2. 在声明类类型的同时定义对象 class Student stud1; 3. 不出现类名,直接定义对象 class stud1;,类与结构体类型的异同 1.用class声明的类如果不带成员访问限定符,所有成员默认限定为private; 2.用struct声明的类如果不带成员访问限定符,所有成员默认限定为public。,类成员 数据成员/成员变量 - private 成员函数/成员方法 - public,inline成员函数 成员函数的存储方式,成员函数的存储方式,对象成员的访问* 对象名+成员运算符 stud1.num =1001; 对象指针 Student *p=,类的封装性和信息隐蔽 1.公用接口与私有实现的分离 2.类声明和成员函数定义的分离P64-65 3.名词:对象、方法、消息 stud.display();,第3章复习要点,构造函数* 构造函数是特殊的公有成员函数,其特征如下: 1.函数名与类名相同。 2.构造函数无函数返回类型说明。注意是什么也不写,也不可写void!实际上构造函数有返回值,返回的就是构造函数所创建的对象。 3.在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也只调用这一次。 4.构造函数可以重载。严格地讲,说明中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。,5.构造函数可以在类中定义,也可以在类外定义。 6. 如果类说明中没有给出构造函数,则C+编译器自动给出一个缺省的构造函数: 类名(void) 但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。 只要构造函数是无参的或各参数均有缺省值的,C+编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个 。,构造函数的重载*,缺省构造函数 Time:Time() hour=0; minute=0; sec=0; Time t; 带参数的构造函数 Time:Time(int h, int m, int s) hour=h; minute=m; sec=s; Time t(13,10,11); 用参数初始化表 Time:Time(int h, int m, int s):hour(h),minute(m),sec(s) 使用默认参数的构造函数 Time:Time(int h=13, int m=10, int s=11) hour=h; minute=m; sec=s; Time t;,析构函数 当一个对象定义时,C+自动调用构造函数建立该对象并进行初始化,那么当一个对象的生命周期结束时,C+也会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数即析构函数(destructor): 1. 构函数名与类名相同,但在前面加上字符,如CGoods()。 2. 析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数。 3. 一个类有一个也只有一个析构函数,这与构造函数不同。析构函数可以缺省。 4. 对象注销时,系统自动调用析构函数。,调用构造函数和析构函数的顺序,构造函数和析构函数例题,1. 在下面有关对构造函数的描述中,正确的是 。 A. 构造函数可以带有返回值 B. 构造函数的名字与类名完全相同 C. 构造函数必须带有参数 D.构造函数必须定义,不能缺省 2在下面有关析构函数特征的描述中,错误的是 。 A. 一个类中只能定义一个析构函数 B. 析构函数名与类名完全相同 C. 析构函数不能指定返回类型 D. 析构函数不能带有参数 3假定AB为一个类,则执行“AB a(4) , b3 , * p2 ;”语句时,自动调用该类构造函数的次数为 。 3 B. 4 C. 6 D. 9 4.对于任意一个类,析构函数的个数最多为( B ) A.0 B.1 C.2 D.3,对象数组 对象数组的定义、初始化、建立数组的同时调用构造函数 P82 例3.6 对象指针* 1.指向对象的指针 2.指向对象成员的指针 2.1.指向对象数据成员的指针 2.2.指向对象成员函数的指针 3. this指针 P85 例3.7 this指针的作用,共用数据的保护 Const,对内存的使用只读不可写(写在首次/初始化完成)。 常对象 const Time t; 或:Time const t; 常数据成员 const int hour; 常成员函数 void get_time() const;,指向对象的常指针 Time * const p1 = /不可改变t的值,对象的动态建立和释放,new ,静态成员Static,由关键字static修饰说明的类成员,成为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。,静态数据成员 初始化(只能在类体外进行初始化) 既可以通过对象名引用,也可以通过类名来引用 静态成员函数 静态成员函数没有this指针 静态成员函数访问静态数据成员,不访问非静态成员,对象的赋值 对象的复制 拷贝构造函数 类名 对象2(对象1) Box:Box(const Box ,Static例题,假定类AB中有一个公有属性的静态数据成员bb,在类外不通过对象名访问该成员bb的写法为 (1) 。 静态成员(static)属于_类_ ,而不属于_任何一个对象_ ,它被同一个类的所有对象共享。,友元 友元函数: friend void display(Time 友元类,允许另一个类或函数访问你的类的东西。 Class A Private:int i=0; Friend class b /声明 Class B Void main() A a1=new A(); B b1= new B(); Int j=b1.i; 可直接访问A类里的 如B是A的友元类,那么a对b完全开放包括private,也就是B可以访问A里任何东西,友元例题,13、关于友元函数 的描述中,错误的是 A. 友元函数不是成员函数 B. 友元函数只能访问类中私有成员 C. 友元函数破坏隐藏性,尽量少用 D. 友元函数说明在类体内,使用关键字friend,B,类模版(不考),第4章复习要点,运算符重载的方法* 格式: 函数类型 operator 运算符名称(形参表列) 对运算符的重载处理 复数+ P122 例4.2 运算符重载的规则 P124-126,运算符重载的实现 1.类成员函数 2.友元函数,双目运算符重载 P134 例4.4 单目运算符重载 区别 “前置和后置” 重载流插入运算符和流提取运算符* 重点是格式:友元函数/普通函数 istream ,不同类型数据间的转换(不考),运算符重载例题,假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的减法,并返回相减结果,则该成员函数的声明语句为:( ) A、 AB & operator - ( ) B、 AB operator -(AB & a) C、 operator -(AB a) D、 AB operator -(AB & a , AB & b),B,第5章复习要点,面向对象程序设计有4个主要特点: 1.抽象 2.封装 3.继承 4.多态性,青处于蓝,而胜于蓝,继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认识过程。 多态性(polymorphism)多态性是考虑在不同层次的类中,以及在同一类中,同名的成员函数之间的关系问题。函数的重载,运算符的重载,属于编译时的多态性。以虚函数为基础的运行时的多态性是面向对象程序设计的标志性特征。 体现了类推和比喻的思想方法。,派生类的声明方式,定义格式* class 派生类名:访问限定符 基类名1,访问限定符 基类名2,访问限定符 基类名n private: 成员表1; /派生类增加或替代的私有成员 public: 成员表2; /派生类增加或替代的公有成员 protected: 成员表3; /派生类增加或替代的保护成员 ;/分号不可少,继承过程,编制派生类时可分四步,吸收基类的成员,改造基类成员,发展新成员,重写构造函数与析构函数,不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接收,声明一个和某基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称为同名覆盖(override),派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展。,派生类的构成*,继承分类,(a)多重继承,(b)单继承,一个基类可以直接派生出多个派生类,派生类可以由多个基类共同派生出来,称多重继承。,派生类成员的访问属性*,多级派生时的访问属性 P164 例5.4,继承例题,1在公有继承的情况下,基类成员在派生类中的访问权限 。 A受限制 B. 保持不变 C. 受保护 D. 不受保护,9.在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( A ) A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针,派生类的构造函数和析构函数*,执行派生类构造函数的顺序是: 调用基类构造函数,初始化基类数据成员 调用子对象构造函数,初始化子对象数据成员 执行派生类构造函数,初始化派生类数据成员 执行派生类析构函数的顺序是: 调用派生类析构函数,清理派生类增加数据成员 调用子对象析构函数,清理子对象数据成员 调用基类析造函数,清理基类数据成员,构造函数和析构函数次序例题,#include using namecpace std; class B1 /基类B1声明 public: B1(int i) cout“constructing B1 “iendl; B1() cout“destructing B1 “endl; ; class B2 /基类B2声明 public: B2(int j) cout“constructing B2 “jendl; B2() cout“destructing B2 “endl; ; class B3 /基类B3声明 public: B3()cout“constructing B3 *“endl; B3() cout“destructing B3 “endl; ;,class C: public B2, public B1, public B3 public: C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b) private: B1 memberB1; B2 memberB2; B3 memberB3; ; void main() C obj(1,2,3,4); ,constructing B2 2 constructing B1 1 constructing B3 * constructing B1 3 constructing B2 4 constructing B3 * destructing B3 destructing B2 destructing B1 destructing B3 destructing B1 destructing B2,派生类构造函数一般形式: 派生类名:派生类名 (总参数表): 基类名(实参表 ), 子对象名(参数表) 派生类新增成员的初始化语句; ,多层派生时的构造函数 P172 例5.7 派生类的析构函数 与构造函数一样,不能继承基类的。,派生类例题,类A与类B都有public数据成员f,类C公有继承A和B,类C有public数据成员f,类D保护继承C,d是类D的一个对象,从d访问类A的成员f的表达式是 。,d.A:f,多重继承,定义: class D: public A, private B, protected C 类D新增加的成员 多重继承派生类的构造函数 派生类构造函数名(总参数表):基类1构造函数(参数表),基类2构造函数(参数表),基类3构造函数(参数表) 派生类新增成员初始化语句 P176 例5.8,多重继承的二义性,在多重继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)采用同名隐藏规则或虚函数(仅针对成员函数)来解决。 当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性采用虚基类来解决。,int a;,int a;,int a;,虚基类* P185 例5.9,class A ; class B: virtual public A ; class C: virtual public A ;,基类与派生类转换* 大材小用,第6章复习要点,一个接口,多种方法,多态性的概念,静态多态 在编译程序时系统就可以确定调用哪个函数,因此静态多态性又称编译时的多态性。静态多态性是通过函数重载实现的。 动态多态 在程序运行中才能确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过基类与派生类转换+虚函数实现的。,多态性例题,C+语言中的多态性分为 时多态性和运行时的多态性。,编译,虚函数*,虚函数是一个类的成员函数,定义格式如下: virtual 返回类型 函数名(参数表); 关键字virtual指明该成员函数为虚函数。virtual仅用于类定义中,如虚函数在类外定义,不可加virtual。 当某一个类的一个类成员函数被定义为虚函数,则由该类派生出来的所有派生类中,该函数始终保持虚函数的特征。,当在派生类中重新定义虚函数(overriding a virtual function,亦译作超载或覆盖)时,不必加关键字virtual。但重新定义时不仅要同名,而且它的参数表和返回类型全部与基类中的虚函数一样,否则联编时出错。 虚函数与改造类成员,同名覆盖(override)有关:如未加关键字virtual,则是普通的派生类中的新成员函数覆盖基类同名成员函数(当然参数表必须一样,否则是重载),可称为同名覆盖函数,它不能实现运行时的多态性。,比较有虚函数的override和无虚函数的override,访问成员,#include class B0 public: void display() cout display (); ,void main() B0 b0; B1 b1; D1 d1; B0 *p; p = ,B

温馨提示

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

评论

0/150

提交评论