创建功能更强的类型课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《创建功能更强的类型课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 创建 功能 类型 课件
- 资源描述:
-
1、v抽象的过程 v面向对象的程序设计的特点 v库和类 v计算机的工作是建立在抽象的基础上。机器语言和汇编语言是对机器硬件的抽象高级语言是对汇编语言和机器语言的抽象v现有抽象的问题:要求程序员按计算机的结构去思考,而不是按要解决的问题的结构去思考。当程序员要解决一个问题时,必须要在机器模型和实际要解决的问题模型之间建立联系。而计算机的结构本质上还是为了支持计算,当要解决一些非计算问题时,这个联系的建立是很困难的 v为程序员提供了创建工具的功能 v解决一个问题时程序员首先考虑的是需要哪些工具创建这些工具用这些工具解决问题v工具就是所谓的对象v现有的高级语言提供的工具都是数值计算的工具 v过程化的设计
2、方法:从功能和过程着手输入圆的半径或直径利用S=r2和C=2r计算面积和周长输出计算结果 v面向对象的程序设计方法:需要什么工具。如果计算机能提供给我们一个称为圆的工具,它可以以某种方式保存一个圆,告诉我们有关这个圆的一些特性,如它的半径、直径、面积和周长。定义一个圆类型的变量,以他提供的方式将一个圆保存在该变量中,然后让这个变量告诉我们这个圆的面积和周长是多少 以计算圆的面积和周长的问题为例以计算圆的面积和周长的问题为例v抽象的过程 v面向对象的程序设计的特点 v库和类 v代码重用:圆类型也可以被那些也需要处理圆的其他程序员使用 v实现隐藏:类的创建者创造新的工具类的使用者则收集已有的工具快
3、速解决所需解决的问题这些工具是如何实现的,类的使用者不需要知道 v继承:在已有工具的基础上加以扩展,形成一个功能更强的工具。如在学校管理系统中,可以形成如下的继承关系 人人教师教师学生学生教辅教辅高级高级中级中级初级初级本科本科硕士硕士博士博士实验室实验室行政行政v多态性:当处理层次结构的类型时,程序员往往想把各个层次的对象都看成是基类成员。如需要对教师进行考核,不必管他是什么职称,只要向所有教师发一个考核指令。每位教师自会按照自己的类型作出相应的处理。如高级职称的教师会按高级职称的标准进行考核,初级职称的教师会按初级职称的标准进行考核。v好处:程序代码就可以不受新增类型的影响。如增加一个院士
4、的类型,它也是教师类的一个子类,整个程序不用修改,但功能得到了扩展。v抽象的过程 v面向对象的程序设计的特点 v库和类 v类是更合理的库 v例:设计一个库,提供动态整型数组服务,该数组满足两个要求:可以任意指定下标范围;下标范围可在运行时确定;使用下表变量时会检查下标的越界。v数组的保存数组需要一块保存数组元素的空间。这块空间需要在执行时动态分配。数组的下标可以由用户指定范围。因此,对每个数组还需要保存下标的上下界。保存这个数组的三个部分是一个有机的整体,因此可以用一个结构体把它们封装在一起。v数组操作给数组分配空间给数组元素赋值取某一个数组元素的值由于这个数组的存储空间是动态分配的,因此,还
5、必须有一个函数去释放空间#ifndef _array_h#define _array_h/可指定下标范围的数组的存储struct IntArray int low;int high;int*storage;/根据low和high为数组分配空间。分配成功,返回值为true,否则为falsebool initialize(IntArray&arr,int low,int high);/设置数组元素的值/返回值为true表示操作正常,返回值为false表示下标越界bool insert(const IntArray&arr,int index,int value);/取数组元素的值/返回值为true
6、表示操作正常,为false表示下标越界bool fatch(const IntArray&arr,int index,int&value);/回收数组空间void cleanup(const IntArray&arr);#endif#include array.h#include using namespace std;/根据根据low和和high为数组分配空间。为数组分配空间。/分配成功,返回值为分配成功,返回值为true,否则为否则为falsebool initialize(IntArray&arr,int low,int high)arr.low=low;arr.high=high;ar
7、r.storage=new int high-low+1;if(arr.storage=NULL)return false;else return true;/设置数组元素的值设置数组元素的值/返回值为返回值为true表示操作正常,返回值为表示操作正常,返回值为false表示下标越界表示下标越界bool insert(const IntArray&arr,int index,int value)if(index arr.high)return false;arr.storageindex-arr.low=value;return true;/取数组元素的值取数组元素的值/返回值为返回值为tru
8、e表示操作正常,为表示操作正常,为false表示下标越界表示下标越界bool fatch(const IntArray&arr,int index,int&value)if(index arr.high)return false;value=arr.storageindex-arr.low;return true;/回收数组空间回收数组空间void cleanup(const IntArray&arr)delete arr.storage;#include using namespace std;#include array.h int main()IntArray array;/IntArr
9、ay是是array库中定义的结构体类型库中定义的结构体类型 int value,i;/初始化数组初始化数组array,下标范围为,下标范围为20到到30 if(!initialize(array,20,30)cout 空间分配失败空间分配失败;return 1;for(i=20;i=30;+i)cout 请输入第请输入第 i value;insert(array,i,value);while(true)cout i;if(i=0)break;if(fatch(array,i,value)cout value endl;else cout 下标越界下标越界n;cleanup(array);/回收
10、回收array的空间的空间 return 0;v这个数组的使用相当笨拙。每次调用和数组有关的函数时,都要传递一个结构体给它。v我们可能在一个程序中用到很多库,每个库都可能需要做初始化和清除工作。库的设计者都可能觉得initialize和cleanup是比较合适的名字,因而都写了这两个函数。v系统内置的数组在数组定义时就指定了元素个数,系统自动会根据元素个数为数组准备存储空间。而我们这个数组的下标范围要用initialize函数来指定,比内置数组多了一个操作。v当数组使用结束后,还需要库的用户显式地归还空间。v对数组元素的操作不能直接用下标变量的形式表示。v将函数放入结构体 v好处:函数原型中的
11、第一个参数不再需要。编译器自然知道函数体中涉及到的low,high和storage是同一结构体变量中的成员函数名冲突的问题也得到了解决。现在函数名是从属于某一结构体,从属于不同结构体的同名函数是不会冲突的。#ifndef _array_h#define _array_hstruct IntArray int low;int high;int*storage;bool initialize(int lh,int rh);bool insert(int index,int value);bool fatch(int index,int&value);void cleanup();#endif函数都
12、瘦身了!函数都瘦身了!v与原来的实现有一个变化:函数名前要加限定bool IntArray:initialize(int lh,int rh)low=lh;high=rh;storage=new int high-low+1;if(storage=NULL)return false;else return true;v函数的调用方法不同。就如引用结构体的成员一样,要用点运算符引用这些函数 int main()IntArray array;int value,i;if(!array.initialize(20,30)cout 空间分配失败空间分配失败;return 1;for(i=20;i=30
13、;+i)cout 请输入第请输入第 i value;array.insert(i,value);while(true)cout i;if(i=0)break;if(array.fatch(i,value)cout value endl;else cout 下标越界下标越界n;array.cleanup();return 0;v将函数放入结构体是从C到C+的根本改变v在C中,结构体只是将一组相关的数据捆绑了起来,它除了使程序逻辑更加清晰之外,对解决问题没有任何帮助。v将处理这组数据的函数也加入到结构体中,结构体就有了全新的功能。它既能描述属性,也能描述对属性的操作。事实上,它就成为了和内置类型一
14、样的一种全新的数据类型。v为了表示这是一种全新的概念,C+用了一个新的名称 类来表示。v从面向过程到面向对象 v类的定义 v对象的使用v对象的构造与析构 v常量对象与const成员函数 v常量数据成员 v静态数据成员与静态成员函数 v友元 vclass 类名 private:私有数据成员和成员函数 public:公有数据成员和成员函数 ;v私有成员(private):只能由类的成员函数调用v公有成员(public):类的用户可以调用的信息,是类对外的接口v私有成员被封装在一个类中,类的用户是看不见的class IntArray private:int low;int high;int*stor
15、age;public:bool initialize(int lh,int rh);bool insert(int index,int value);bool fatch(int index,int&value);void cleanup();vprivate 和public的出现次序可以是任意的。也可以反复出现多次。v成员还可以被说明为protectedv数据成员一般说明为private,需要被用户调用的函数说明为publicv与库设计一样,类的定义写在接口文件中,成员函数的实现写在实现文件中。v某些简单的成员函数的定义可以直接写在类定义中。v在类定义中定义的成员函数被认为是内联函数。v试定
16、义一个有理数类,该类能提供有理数的加和乘运算。要求保存的有理数是最简形式。如2/6应记录为1/3。v保存有理数:保存一个有理数就是保存两个整数。v有理数类的操作:加函数乘函数创建有理数的函数,用以设置有理数的分子和分母输出有理数函数化简函数v访问权限设计:数据成员是私有的化简函数是内部调用的函数,与用户无关,因此也是私有的其他函数都是公有的#ifndef _rational_h#define _rational_h#include using namespace std;class Rational private:int num;int den;void ReductFraction();/
17、将有理数化简成最简形式将有理数化简成最简形式public:void create(int n,int d)num=n;den=d;void add(const Rational&r1,const Rational&r2);void multi(const Rational&r1,const Rational&r2);void display()cout num /den)?den:num;for (;tmp 1;-tmp)if(num%tmp=0&den%tmp=0)num/=tmp;den/=tmp;break;v从面向过程到面向对象 v类的定义 v对象的使用v对象的构造与析构 v常量对象与
18、const成员函数 v常量数据成员 v静态数据成员与静态成员函数 v友元 v类与对象的关系:类型与变量的关系v对象定义方法:直接在程序中定义某个类的对象存储类别存储类别 类名类名 对象列表;对象列表;如定义两个如定义两个IntArrayIntArray类的对象类的对象arr1arr1和和arr2arr2,可写成:,可写成:IntArray arr1,arr2;IntArray arr1,arr2;用动态内存申请的方法申请一个动态对象。Rational *rp;Rp=new Rational;rp=new Rational20;delete Rp;或delete rp;v对象名.数据成员名 或
19、对象指针-数据成员名 arr1.storage 或 rp-numv对象名.成员函数名(实际参数表)或对象指针-成员函数名(实际参数表)arr1.insert()或 rp-add()v外部函数不能引用对象的私有成员#include using namespace std;#include Rational.h/使用有理数类使用有理数类int main()int n,d;Rational r1,r2,r3;/定义三个有理数类的对象定义三个有理数类的对象 计算两个有理数的和与积计算两个有理数的和与积 cout n d;r1.create(n,d);cout n d;r2.create(n,d);r3
20、.add(r1,r2);/执行执行r3=r1+r2 r1.display();cout +;r2.display();cout =;r3.display();cout endl;r3.multi(r1,r2);/执行执行r3=r1*r2 r1.display();cout *;r2.display();cout =;r3.display();cout num=n;this-den=d;v通常,在写成员函数时可以省略this,编译时会自动加上它们。v如果在成员函数中要把对象作为整体来访问时,必须显式地使用this指针。这种情况常出现在函数中返回一个对调用函数的对象的引用,v从面向过程到面向对象
21、v类的定义 v对象的使用v对象的构造与析构 v常量对象与const成员函数 v常量数据成员 v静态数据成员与静态成员函数 v友元 v某些类的对象,必须在对它进行了初始化以后才能使用。v对于某些类的对象在消亡前,往往也需要执行一些操作,做一些善后的处理。v初始化和扫尾的工作给类的用户带来了额外的负担,使他们觉得类和内置类型还是不一样。v用户希望使用类的对象就和使用内置类型的变量一样,一旦定义了,就能直接使用。用完了,由系统自动回收。v构造函数和析构函数是特殊的成员函数v构造函数:为对象分配空间,进行初始化。v析构函数:执行与构造函数相反的操作,通常执行一些清理工作,如释放分配给对象的空间等。v定
22、义对象时,系统会自动调用构造函数。v构造函数的名字必须与类名相同v构造函数可以有任意类型的参数,也可以不带参数,但不能具有返回类型。因此在定义构造函数时,不能说明它的类型,甚至说明为void类型也不行。v如果没有给类定义构造函数,编译系统会自动生成一个缺省的构造函数。它只为对象开辟存储空间,空间中的内容为随机数。v构造函数可以重载v如IntArray类需要有一个构造函数,该函数可定义为 IntArray(int lh,int rh)low=lh;high=rh;storage=new int low high+1;有了构造函数,就不需要initialize函数了。而且可以把定义时完成初始化工作
23、。v定义对象时,须指定构造函数的实际参数 IntArray array(20,30);vRational类也可以有一个构造函数,该函数可定义为 Rational(int n1,int n2)(num=n1;den=n2;ReductFraction();同样,有了构造函数可以在定义时给有理数赋初值v定义对象时,须指定构造函数的实际参数 Rational r(2,7);#include using namespace std;class complex private:double real,imag;public:complex(double r,double i)real=r;imag=i;
24、double abscomplex()double t;t=real*real+imag*imag;return(t);;v有了构造函数后,对象定义的一般形式为:类名 对象名(实际参数表);其中,实际参数表必须和该类的某一个构造函数的形式参数表相对应。v除非这个类有一个构造函数是没有参数的,那么可以用:类名 对象名;v不带参数的构造函数称为默认的构造函数。int main()complex a(1.2,2.2);/在定义对象时必须给构造函数传递参数在定义对象时必须给构造函数传递参数 cout a.abscomplex()endl;retuen 0;#include Using namespac
25、e std;class complex private:double real,imag;public:complex(double r=0.0,double i=0.0)real=r;imag=i;;int main()complex a;/全部用缺省值 complex b(1.1);/只传递一个参数,第二个用缺省值 complex c(1.1,2.2);/传递二个参数,不用缺省值 。vRational(int n1=0,int n2=1)(num=n1;den=n2;ReductFraction();v表示缺省情况下,构造的是一个值为0的有理数v动态变量的初始化是在类型后面用一个圆括号指出
展开阅读全文