第2章对象、类和派生.ppt

上传人:tang****xu1 文档编号:528349 上传时间:2018-09-27 格式:PPT 页数:90 大小:156KB
返回 下载 相关 举报
第2章对象、类和派生.ppt_第1页
第1页 / 共90页
第2章对象、类和派生.ppt_第2页
第2页 / 共90页
点击查看更多>>
资源描述

《第2章对象、类和派生.ppt》由会员分享,可在线阅读,更多相关《第2章对象、类和派生.ppt(90页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1,第2 章 对象、 类和派生,概述类和对象构造函数和析构函数 const对象和const成员函数实例 : 有理数类 继承: 基类和派生类7.实例 : 类point、circle和cylinder,2,概述,对象: 问题对象 行动或思考时作为目标的人或事物. 通过对象思考问题. 软件对象(模拟问题对象) 数据(表示属性) 操作(对象的行为),3,2. 类:对象划分成类. 一类对象的描述. 数据成员 成员函数 对象通过类生成程序设计 以函数为单位; 以类为单位. 程序结构:类结构.,封装,4,用面向对象的程序语言进行程序设计,一个基本工作就是定义程序中所需要的各种对象。采用的方式是先定义对象的类

2、,然后用这些类生成程序中要使用的对象。 把类看成类型, 对象看成变量,用类型声名变量;用类声名对象。 类型 变量名 类 对象,5,2. 类和对象,class 类名 private: 私有的数据和成员函数; public: 公有的数据和成员函数; ; 类是对象的抽象, 是定义对象的一种抽象数据类型;而对象是类的具体实例。,6,class stud private: int num; char name10; char sex; public: void display( ) cout“num”numendl; cout“name”nameendl; cout“sex”sexendl; ;stud

3、 student1, student2 ;,7,访问权限: 类是一个程序范围,在一个类内, private下的成员,仅能被类内的成员函数访问. public下的成员,能被类内的成员函数和外部的函数访问. 访问表示法: 对象名.成员 例: student1.display(),8,public: 成员1; .成员n,不可见部分:private: 成员1; .成员mpublic: 成员函数的实现,用户1可见部分,用户2,用户i,9,构造函数(constructor) 作用: 建立对象时初始化; 建立对象时自动执行; 表示方法: 同类名 和析构函数(destructor) 作用: 对象灭亡时做善后工

4、作; 对象灭亡时系统自动执行它. 表示方法: 类名( ),10,class stud private: int num; char name10; char sex; public: stud( ) num=10010; sex=f ; name=strcpy(name,”Wang_Li”: void display( ) cout“num”numendl; cout“name”nameendl; cout“sex”sexendl; ;stud student1;,11,构造函数可定义如下: stud ( int n, char namee , char s ) num=n; strcpy(n

5、ame, namee); sex=s; stud student1( 10010, “Wang_Li”, f );stud student21( 10011, “Zhang_Fun”, m );,12,构造函数可以重载: stud ( ) num=10010; sex= f ; strcpy(name, “Wang_Li”); stud ( int n, char namee , char s ) num=n; strcpy(name, namee); sex=s; stud student1( );stud student21( 10011, “Zhang_Fun”, m );,13,例 1

6、5.2 含有析构函数#include#includeclass stud private: int num; char name10; char sex; public: stud (int n, char namee , char s ) num=n; sex=s; strcpy(name,namee); stud( ) ,14,void display( ) cout“num”numendl; cout“name”nameendl; cout“sex”sexendl; ;Void main( ) stud student1(10010, “Wang_Li”,f ), student2(10

7、011, “Zhang_Fun”, m); student1.display( ); student2.display( ); ,15,例 15.3 在类的外面定义成员函数#include#includeclass stud private: int num; char name10; char sex; public: stud (int n, char namee , char s ); stud( ) ; display( ); ,16,stud:stud( int n, char namee , char s) num=n; strcpy(name, namee); sex=s; st

8、ud:stud( ) void stud: display( ) cout“num”numendl; cout“name”nameendl; cout“sex”sexendl; ,17,void main( ) stud student1(10010, “Wang_Li”,f ), student2(10011, “Zhang_Fun”, m); student1.display( ); student2.display( ); ,18,用面向对象的术语,访问一个成员函数的过程被称为向对象“发送一个消息”,对象之间通过这种消息发送的方式互相传递信息。 成员函数也称为方法.,19,const对象

9、与const成员函数 用const指定对象不能修改,且若修改会产生语法错误. 例, const time noon(12, 0, 0) ; 仅声明为const 的成员函数能调用(作为消息发送给)const对象.隐含: * const 成员函数不能修改(const对象的)数据成员; * const 成员函数不能调用同一类实例的非 const 成员函数 ; * const对象不能调用非const 成员函数 ;,20,下面是有理数类的例子,21,类的界面描述和实现 我们以数学中有理数作为例子,详细介绍C+语言中提供的各种支持构造类和对象的机制。,22,class rationalpublic: ra

10、tional( ); rational(int); rational(int,int); rational(const rational ,23,通常把一个类的界面定义和类实现的程序代码分放在两个文件里: 界面定义文件,它给出类的定义,其中说明了类的名字、类中各个数据成分的名字和类型、类中各有关操作的名字及操作的参数类型,等等。 实现文件,在这个文件里给出各操作的具体程序代码。,24,类的界面描述本身通常分成两个部分:用关键字public引出的一段(称为公共部分)描述的是类的界面,在这里说明的各种成分在类外部都可以(直接) 引用,而由另一个关键字private开始的一段(私有部分)里定义的各种

11、操作和数据成分则完全是内部的,这些成分用于类的实现,在类外面根本看不见,也就完全不能使用。,25,2.3.1 类的数据域 类定义里通常说明一些存储数据值的域。在程序执行中,这些数据域的值刻画了对象(类的实例)的内部状态。 在有理数类的定义里有两个数据域,它们位于定义的最后部分,这两个域都是整数类型的,名字分别是numerator和denominator,用于表示有理数的分子和分母。,26,2.3.2 对象的行为成员函数 为了实现有理数类,能够表示有理数和说明有理数变量只是问题的一个方面,另一个更重要的方面是需要提供一批能够对有理数进行操作的函数。,27,对有理数的最基本操作是访问其分子和分母,

12、在有理数类里提供了一对函数(num和den)来实现这两个访问操作。 由于一个类可以产生多个实例,因此,在使用函数时必须说明被作用的对象是哪一个实例。C+语言提供的写法是首先指明被操作的对象本身(例如写出一个变量名),后面写一个圆点,随后再给出对这个对象使用的函数。,28,假定left和right是两个有理数变量,下面的表达式将计算出它们的和的分子(值): left.num( )*right.den( )+right.num( )*left.dem( ),29,C+语言里,为类实例的各种行为定义的函数被称为是类的“成员函数”。为了完成有理数类的定义,我们还必须为各个成员函数提供实际实现的代码。

13、在成员函数的头部除了写出函数本身名字外,在它之前还需要给出它所属的类的名字,其具体表示方式是用符号“:”把类名和函数名连接起来。,30,int rational:num( )const return numerator;int rational:den( ) const return denominator;,31,函数的参数表后面写着关键字const,说明该函数的执行不会改变被它作用的实例本身。 例如num和den函数的执行不会对被作用的有理数的值产生任何影响。这种函数被称为“常数函数”。,32,2.3.3 运算符作为成员函数 如果一个运算符需要直接使用类的私有成分,那么它就应该定义为类的成

14、员函数。 类2.1描述了与有理数有关的各种赋值函数的原型,它们都被定义为类的成员函数,33,在定义二元运算符成员函数时,作为定义主体的类实例本身就是运算符左边的那个运算对象,因此它不必再进行说明。 这样,我们在函数定义的首部只需要说明运算符右边的那个运算对象。下面是赋值运算和递加赋值运算的定义:,34,void rational:operator=(const rational ,35,void rational:operator+=(const rational /对结果做正规化,36,当我们想为一个运算符定义重载时,必须用关键字operator作为运算符号的先导,这是语言的规定。,37,由

15、于通过加法运算得到的结果可能不再是最简分数,因此在得到了结果后还需要对其进行正规化,约去分子分母的公约数。 有理数正规化操作用类的成员函数normalize完成。 在类定义中,normalize被说明为一个“私有”成员函数。,38,还有一个值得注意的问题:如果在一个成员函数的实现程序里调用本类的另一个成员函数,就不需要再说明函数的接受者,这时该函数的接受者自动地被认为是当前实例。,39,void rational:normalize( ) /先 将符号存到sign中,然后 约去公因子 int sign=1; / sign为1表示正,-1表示负 if (numerator0) sign=-1;

16、numerator=-numerator; if (denominator=(const rational ,58,2.4.2 普通函数 普通函数的定义方式与C语言中的函数定义在 形式上完全一样,函数实现里不能使用类的私有成分,普通函数的名字也可以重载。,59,2.4.3 对象的输入和输出,C+语言是C的扩充,在C+程序中也可以采用C的输出方式。例如: printf(“%d,%d,%d,%dn”,m,n,k,(m+n+k)/3 ); 上述方法有一个问题:在函数printf被定义之后,它能够处理的格式描述符也就固定下来了。,60,要解决输出函数功能可扩充问题,C+语言提出的方法是对运算符进行重载

17、,为此,C+ 语言中引进了一种新的数据类型流,对于输出提供的流是ostream(输出流类),对于输入提供的流是istream(输入流类)。流是一种可以向文件输出(或从文件输入)数据的机制。,61,C+中用来表示输出的运算符是,用它的重载描述将数据送入流的操作。 当运算符右边的参数是一个字符时,该字符的值就被送到与流关联的文件里。,62,在C+语言的标准输入输出库里定义了一个全局变量cout,它表示“标准输出流”,这个流被关联于系统的标准输出设备(通常是终端显示器)。 这样,用下面一个语句就能够实现与前面例子同样的输出。 coutm,n,k,intv;,65,用构造的输入语句可以直接用作条件语句

18、或循环语句的条件表达式,当输入中遇到文件结束时,表达式将返回逻辑“假”。 与输出的情况相同,用户也可以方便地为自己的类型定义输入运算符的重载。程序1.2是为有理数输入而写的定义。,66,istream / 返回流 in,67,有理数类例子到此结束,68,继承: 基类和派生类,软件复用,通过已有的类建立新类对象分类常出现下面的层次谱系,图形,二维图形,三维图形,圆,方形,三角形,球,六面体,圆柱,69,基类,数据成员成员函数,继承部分新定义部分,派生类,继承,派生,70,定义派生类的一般形式:class 派生类名: 引用权限 基类名 派生类新增加的数据成员 派生类新增加的成员函数 引用权限: p

19、rivate /* 缺省 */ public protected 从基类继承来的成员的引用权限.,71,例 15.4 通过继承建立派生类#include#includeclass stud private: int num; char name10; char sex; public: stud (int n, char namee , char s ); stud( ) ; display( ); /* 成员函数的定义*/,72,class student : public stud private: int age ; char addr30; public: void display_1

20、 ( ) cout“age:”ageendl; cout“address:”addrendl; student student1 ;,73,14.3 公用派生类 (一个类的)友员函数和友员类 friend 函数名 friend 类名 友员函数和友员类的成员函数可以访问该类中的private成员. protected成员 protected介于private和public之间.基类的protected成员只能被基类的成员和友员以及派生类的成员和友员访问.,74,公用派生类,基类private 成员protected 成员public 成员,派生类 不可访问 protected 成员 public

21、 成员,75,例 15.4 通过继承建立公用派生类#include#includeclass stud private: int num; char name10; char sex; public: stud (int n, char namee , char s ); stud( ) ; display( ); /* 成员函数的定义*/,76,class student : public stud private: int age ; char addr30; public: void show ( ) cout“num:”numendl; cout“name:”nameendl; cou

22、t“sex:”sexendl; cout“age:”ageendl; cout“address:”addrendl; ,/*error*/,77,class student : public stud private: int age ; char addr30; public: void show ( ) display( ); cout“age:”ageendl; cout“address:”addrendl; ,78,私有派生类,基类private 成员protected 成员public 成员,派生类 不可访问 private 成员 private 成员,79,例 15.4 通过继承建

23、立私有派生类#include#includeclass stud private: int num; char name10; char sex; public: stud (int n, char namee , char s ); stud( ) ; display( ); /* 成员函数的定义*/,80,class student : private stud private: int age ; char addr30; public: void show ( ) display( ); /* 访问私有成员*/ cout“age:”ageendl; cout“address:”addr

24、endl; ,81,Protected继承,基类private 成员protected 成员public 成员,派生类 不可访问 protected 成员 protected 成员,82,15.4.6 派生类的构造函数 在派生类中只执行派生类的构造函数. 设计的派生类构造函数应该调用基类的构造函数. 例 15.7 派生类的构造函数,83,#include #include class stud protected: int num; char name10; char sex; public: stud (int n, char namee , char s ); stud( ) ; disp

25、lay( ); ; /* 成员函数的定义*/,84,class student : private stud private: int age ; char addr30; public: student (int n,char nam , char s, int a, char ad ):stud(n, nam, s ) age=a; strcopy(addr,ad); void show ( ) display( ); /* 访问私有成员*/ cout“age:”ageendl; cout“address:”addrendl; student( ) ;,85,实例: 类point、circ

26、le和cylinder,point,circle,cylinder,86,#define POINT_H class point friend ostream ,87,#include class circle: public point friend ostream /* 成员函数的定义*/,88,#include class cylinder: public circle friend ostream /*成员函数定义*/,89,int main( ) cylinder cyl(5.7, 2.5, 12, 23 ) ; cyl.setheight(10) ; cyl.setradius(4.25) ; cyl.setpoint(2, 2) ; point ,90,C+ 大学教程 (第二版)The Complete C+ Training Course Second Edition Harvey M.Deitel Paul James Deitel 邱仲潘 等译 冯 平 审校 电子工业出版社,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁