第十四十七部分C面向对象概述教学课件.ppt

上传人:本田雅阁 文档编号:3129592 上传时间:2019-07-14 格式:PPT 页数:49 大小:493.53KB
返回 下载 相关 举报
第十四十七部分C面向对象概述教学课件.ppt_第1页
第1页 / 共49页
第十四十七部分C面向对象概述教学课件.ppt_第2页
第2页 / 共49页
第十四十七部分C面向对象概述教学课件.ppt_第3页
第3页 / 共49页
第十四十七部分C面向对象概述教学课件.ppt_第4页
第4页 / 共49页
第十四十七部分C面向对象概述教学课件.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第十四十七部分C面向对象概述教学课件.ppt》由会员分享,可在线阅读,更多相关《第十四十七部分C面向对象概述教学课件.ppt(49页珍藏版)》请在三一文库上搜索。

1、第十四-十七章 C+面向对象概述,主要内容,面向对象程序设计基础 继承性与派生类 多态性与虚函数 Visual C+ 6.0应用程序举例,一、面向对象程序设计基础,一、面向对象程序设计基础,C+是C的超集 C+不仅仅是一种面向对象的程序设计语言,而且也可以开发面向过程的程序。 介绍: 类和对象的定义, 如何使用对象解决实际问题,1.类和对象,类和对象的引入,使C+真正成为支持面向对象程序设计的语言。 类就像蓝图 对象是类的具体实例 对象最终要通过类实例化! C+程序中的重点是类而不是函数。 类是程序员定义类型。每个类包含数据和操作数据的一组函数。类的数据部分称为数据成员(data member

2、),类的函数部分称为方法(method,有的时候也称为成员函数)。 先声明类,再由类生成其对象。 类是建立对象的模板,对象则是类的一个实例。,2.从结构体到类,C的结构体中可以包含不同的数据类型。 在C语言中,数据和操作是分开的! C+语言把结构体进行扩充 含有不同的数据类型 含有函数 类是一种封装了数据和对数据进行操作的自定义的数据类型。,3.类的定义形式,class 类名 private: 私有成员 public: 公有成员 protected: 保护成员 ;,4.对象的定义,对象是类的实例,对象的定义有下面两种情况: 声明类时直接定义对象 在声明类的右括号“”后直接列出对象名,并且可以定

3、义多个对象。对象之间用“,”隔开,并且在最后一个对象的后边添加一个“;” 声明类之后再定义对象 定义形式与一般变量定义一样。其基本形式为: 类名 对象;,5.对象的使用,对象的定义完成以后就可以在程序中使用该对象。 其类型为公有(public),在类的外部都可以通过对象进行访问。访问的形式如下: 对象名.数据成员 对象名.函数成员(实参列表) 注意:对于类的包含成员和私有成员,类的对象并不能直接访问。因此一般情况下都会 利用一定的接口对类的包含成员和私有成员进行访问。 参看书上示例14.1、14.2,6.对象的初始化、构造函数和析构函数,对象也被称为类变量。 作为变量,对象可以为其数据成员赋初

4、值。 对象的初始化 有多种不同的方式。 如果一个类只有公共数据成员,那么其对象的初始化与一般变量、结构变量或数组的初始化没有什么区别,在生成对象后设置其数值。 在C+中,对象中数据成员的初始化最常用的方法是在构造函数中完成。,7.构造函数,构造函数是一种特殊的成员函数,是与类名同名的成员函数。 构造函数在每次生成对象(实例化,使用new关键字)时自动调用,进行一些初始化工作。 构造函数可以重载,提供初始化对象的不同方法。,8.构造函数性质,构造函数和类的名字相同。 构造函数不具有返回值。 定义对象时,系统根据提供的参数自动调用构造函数。 构造函数是公有函数,但它不可以被显式调用。,9.程序讲解

5、,示例14.3 示例14.4 程序中如果定义了构造函数,无论它是否带有参数,系统不会再添加构造函数。因此,如果此时的构造函数带有参数,并且没有指定默认值,那么在创建对象时必须指定参数。,10.析构函数,析构函数也是一种特殊的成员函数,它执行和构造函数相反的工作。 析构的特殊性质: 析构函数名称与类名相同,但前面加一个“”。 一个类中只有一个析构函数,并且该函数不带任何参数。 当撤销对象时编译系统自动调用析构函数。 若程序员没有定义析构函数,编译系统会生成析构函数。,11.构造函数和析构函数的调用机制,构造函数和析构函数都是自动调用的。 构造函数因为可以重载,可以有多个,通过参数的不同而确定调用

6、哪一个; 而析构函数只有一个。 构造函数和析构函数的调用次序取决于执行过程进入和离开实例化对象范围的顺序。 当有多个对象被嵌套使用的时候,一般来说,析构函数的调用次序与构造函数相反。,12.类的包含和子对象的初始化,一个类的对象可以是另一个类的成员,称为类的包含(有时也称为复合),作为成员的对象称为子对象。 例如: class A class B A a ; / 子对象 public; ; 其中,类A的对象a是B的一个成员,对象a称为B的成员对象或子对象,类B和类A形成包含关系。,13.对象的使用,类是一种数据类型,是对象类型,对象是一种变量,是类变量。 各种类型变量的使用方法同样适用于对象,

7、 对象指针 对象数组 对象作为函数的参数,14.对象的作用域与生命周期,按照作用域和生命周期,可将对象分为如下三类: 全局对象 作用域最大,有文件级和程序级作用域;生命期最长。 局部对象 函数的形参以及函数内部声明的对象都是局部对象。 局部对象的作用域最小,生命周期是函数的执行过程。 静态对象 C+使用static声明静态变量。静态对象的作用域和生命期介于全局对象和局部对象之间。其作用域为块级、函数级或文件级。,15.静态成员,静态成员的提出是为了解决数据共享的问题。 静态数据成员的使用方法: 静态数据成员在定义或说明时前面加关键字static。 静态数据成员初始化的格式如下: :=,16.静

8、态数据成员的应用,#include class Myclass public: Myclass(int a, int b, int c); void GetNumber(); void GetSum(); private: int A, B, C; static int Sum; ; int Myclass:Sum = 0; Myclass:Myclass(int a, int b, int c) A = a; B = b; C = c; Sum += A+B+C; ,void Myclass:GetNumber() cout“Number=“A“,“B“,“Cendl; void Mycla

9、ss:GetSum() cout“Sum=“Sumendl; void main() Myclass M(3, 7, 10),N(14, 9, 11); M.GetNumber(); N.GetNumber(); M.GetSum(); N.GetSum(); ,17.友元,友元: 需要在类的外部访问类的私有成员。 类的友元函数在类范围之外定义,但有权访问类私有(private)成员。 函数或整个类都可以声明为另一个类的友元。,18.友元的应用,友元函数: 在类的定义中声明友元函数时,需要在函数名前面加上friend。 友元函数可以定义在类的内部,也可以在类的外部定义。 友元成员 一个类的成员

10、函数也可以作为另一个类的友元。这样的函数不仅可以访问本类的所有成员,还可以访问其友元类的所有成员。 友元类 在类的声明中加入语句friend类名。 例如: 要将类ClassB声明为ClassA的友元,在ClassA的定义中应如下声明: friend class ClassB;,二、继承性与派生类,1.继承概述,继承对面向对象编程至关重要。 继承在原有类的基础上定义出新的类,新类不仅拥有新定义的数据成员和函数成员,而且自动继承并拥有原有类的数据成员和函数成员。,2.基类与派生类,基类 原有的类称为基类(或父类) 派生类 新类称为派生类(或子类)。 单一继承 派生类只有一个基类。 多重继承 派生类

11、常常是从多个基类派生出来的,这些基类之间可能毫无关系。 单一继承比较简单,多重继承更复杂,,3.单一继承,单一继承 从一个基类中派生出的继承称为单一继承。 单一继承派生类的定义形式如下: class 派生类名:继承方式 基类名 派生类新定义的成员 ; 派生类名是由基类派生出来的派生类的名字。 基类即可能是派生类的直接基类,也可能是派生类的间接基类。 在定义派生类时,派生类的首部要显示的列出直接基类。 间接基类不是显示的列在派生类的首部,而是沿着类的多个层次逐次向上继承。,4.继承方式,5.多重继承,一个类也可以从多个基类派生而来,这种派生称之为多重继承。 多重继承的定义形式如下: class

12、派生类名:继承方式1 基类名1,继承方式2 基类名2,.,继承方式n 基类名n 派生类新定义的成员 ; 在多重继承定义中,必须给每个基类分别指定继承方式,继承方式和基类成员的访问权限共同决定基类成员在派生类中的访问权限,其规则与单一继承相同。,6.多重继承中的歧义,使用多重继承会影响到类中成员的查找。 当派生类定位一个成员的时候,所有的直接基类会被同时查找,如果从两个或多个基类中继承了同名的成员,则增加了歧义引用的可能性。 解决方法: 在程序层次上,解决成员歧义的方案是用类操作符显示限定修饰“期望被调用的成员属于哪个实例”。 类设计者完成 参看示例15.7,7.继承中的一个问题,当派生类D的两

13、个基类B和C都从一个公共基类A派生而来,创建类D的对象时会创建两个类A的相同副本,即此时每一个D的对象都会有含有两个A的对象。 效率上存储两个A对象的副本,浪费了存储空间; D对象中存在两个A对象会引起歧义。任何未经修饰的访问D中的成员A对象都会产生编译时刻的错误:到底访问哪个呢? 如果B和C对其A子对象的初始化有不同的时候,又会如何?,8.虚拟继承,虚拟继承 只有一个共享的基类子对象被继承 无论该基类在继承层次中出现多少次。 这个共享的基类被称之为“虚基类”。,9.虚基类,对于上面的例子, 声明派生类B和类C时,将公共基类A声明为虚基类, 由类B和类C派生出来的类D在创建对象时将只建立公共基

14、类A的一个副本。 在声明派生类时,虚基类的声明形式如下: class 派生类名:virtual 继承方式 基类名 派生类新定义的成员 ; 关键字virtual申明基类为虚基类,多重继承时,每一个虚基类都需要一个关键字virtual。,三、多态性与虚函数,1.多态性与虚函数,多态性是指同一对象接受相同的消息时产生不同行为,即对应相同的函数名却执行不同的函数体。 在C+中,多态性主要通过两类三种方式实现。 第一类:静态多态(静态联编的多态、编译时多态) 有两种实现方式: 运算符重载 函数重载 第二类:动态多态(动态联编的多态、运行时多态) 有一种实现方式: 虚函数,2.运算符重载,为已有的运算符定

15、义新的功能,使得同一个运算符作用于不同类型数据时产生不同的行为。 为自定义的数据类型定义运算符。 通过定义成员函数或友元函数来实现。,3.运算符重载的几个概念,可以重载的运算符 多数运算符都可以重载,只有以下几个运算不可以重载: . 圆点运算符 ?: 三目运算符 .* 成员指针选择 Sizeof 测试数据长度运算符 : 作用域运算符 typeof 测试数据类型运算符 运算符重载的限制 原有特性不变 操作数个数不变; 优先级不变; 结合性不变; 语义不变 注意: 通常不随意改变重载运算符的功能含义。 定义运算符重载的函数时不能设置默认值。 只能使用C+已有的运算符,不可自己创造新的运算符。,4.

16、运算符重载实现,运算符重载为成员函数的定义形式: operator () 运算符重载为友元函数的定义形式: friend operator () ,5.静态联编和动态联编,将程序中的函数调用解释为执行特定的函数体被称为联编(binding)。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。 静态联编: 联编工作出现在编译连接阶段,在编译时进行。 动态联编: 在程序运行时进行联编。 如何来确定是静态联编还是动态联编呢? C+规定动态联编是在虚函数的支持下实现的。,6.静态联编,静态联编的函数重载主要有两种方式: 在同一个类中重载函数, 基类成员函数在派生类中重载。,7.函

17、数重载,函数重载(function overloading) C+允许定义多个同名函数,只要这些函数有不同的参数列表(至少有不同类型的参数)。 在静态联编的时候,C+通过签名进行区别。 签名是函数名和参数类型的组合。 注意: 全局函数和类的成员函数同名不算重载,因为函数的作用域不同。,8.成员的重载,成员函数被重载的特征: 相同范围(在同一个类中); 函数名字相同; 参数不同(个数、类型、顺序); virtual关键字可有可无。,class A public: / show(int,int); show(double); show(double,int); /重载函数参数类型和个数不同,9.基

18、类成员函数在派生类中重载,在派生类中重载基类中的成员函数,实质还是成员函数的重载,10.动态联编,C+中动态联编是在虚函数的支持下实现的。 使用虚函数的时候,在程序编译阶段无法确定该函数调用应执行哪一段函数代码,只有在程序运行过程中执行到这个调用时,才能确定执行哪一段函数代码的联编方式(动态联编),这是动态多态的实现原理。,11.虚函数,虚函数的声明方法是在基类的函数原型前加上关键字virual。 虚函数的定义 虚函数的的定义格式如下: virtual () 说明: 函数必须是非静态的成员函数,不能是非成员函数。 析构函数可以是虚函数,构造函数不能是虚函数。 虚函数体可以定义在类体内,也可以定

19、义在类体外,在类体外不加virtual。 虚函数具有传递性,一个函数一旦被声明为虚函数,则不管经历多少派生层,派生类中所有声明原型相同的函数都是虚函数。 在派生类中,虚函数可以不加关键字virtual。,12.纯虚函数和抽象类,纯虚函数不必定义其函数体。 含有纯虚函数的类称为抽象类。,13.虚函数,虚函数为了重载和多态的需要,在基类中定义的,即使函数体定义是空,所以子类中可以重写也可以不写基类中的函数。 纯虚函数在基类中是没有函数具体定义的,必须在子类中加以实现。 纯虚函数定义形式如下: virtual () =0; 该函数定义中用赋值为0表示没有实现函数具体实现的定义。,14.抽象类,抽象类是一种特殊的类,为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。 抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护(protected)的访问控制权限。 抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。,四、Visual C+ 6.0应用程序举例,应用程序举例,鼠标绘图详见书上实例 动画按钮详见书上实例 指针式时钟详见书上实例,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1