书签 分享 收藏 举报 版权申诉 / 529
上传文档赚钱

类型创建功能更强的类型课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3590846
  • 上传时间:2022-09-22
  • 格式:PPT
  • 页数:529
  • 大小:2.25MB
  • 【下载声明】
    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动态变量的初始化是在类型后面用一个圆括号指出

    26、它的实际参数表v如果要为一个动态的IntArray数组指定下标范围为20到30,可用下列语句:p=new IntArray(20,30);v括号中的实际参数要和构造函数的形式参数表相对应。v构造函数还有一个与普通函数不同的地方,就是可以包含一个构造函数初始化列表。v构造函数初始化列表位于函数头和函数体之间。它以一个冒号开头,接着是一个以逗号分隔的数据成员构造列表v如IntArray的构造函数可写为 IntArray:IntArray(int lh,int rh):low(lh),high(rh)storage=new int high-low+1;v事实上,不管构造函数中有没有构造函数初始化列

    27、表,在执行构造函数体之前,都要先调用每个数据成员对应的类型的构造函数初始化每个数据成员。v在构造函数初始化列表中没有提到的数据成员,系统会用该数据成员对应类型的默认构造函数对其初始化。v显然利用初始化列表可以提高构造函数的效率。在初始化数据成员的同时完成了赋初始的工作。我们完全可以在函数体内对数据成员赋初值我们完全可以在函数体内对数据成员赋初值 !v数据成员不是普通的内置类型,而是某一个类的对象,可能无法直接用赋值语句在构造函数体中为它赋初值v类包含了一个常量的数据成员,常量只能在定义时对它初始化,而不能对它赋值。因此也必须放在初始化列表中。v构造函数可以重载,导致对象可以有多种方式构造v试设

    28、计一个时间转换器,用户可输入秒、分秒或时分秒输出相应的秒数。#include Using namespace std;class timer int second;public:timer(int t)second=t;timer(int min,int sec)second=60*min+sec;timer(int h,int min,int sec)second=sec+60*min+3600*h;int gettime()return second;main()timer a(20),b(1,20),c(1,1,10);couta.gettime()endl;coutb.gettime(

    29、)endl;coutc.gettime()endl;v析构函数在撤销对象时,完成一些善后工作,由编译系统自动调用v析构函数与构造函数名字相同,但它前面必须加一个波浪号()v析构函数没有参数,没有返回值,也不能重载。v若定义类时没有定义析构函数,编译系统会自动生成一个缺省的空析构函数v并不是每个类都必须要有析构函数,如Rational类就不需要析构函数。v一般在构造函数中有动态申请内存的,必须有析构函数。如IntArray类,必须有析构函数释放storage指向的空间。有了析构函数,就不需要cleanup函数了#ifndef _array_h#define _array_hclass IntAr

    30、ray int low;int high;int*storage;public:IntArray(int lh,int rh):low(lh),high(rh)storage=new int high-low+1;bool insert(int index,int value);bool fatch(int index,int&value);IntArray()delete storage;#endifint main()IntArray array(20,30);/不需要不需要initialize函数函数 int value,i;for(i=20;i=30;+i)cout 请输入第请输入第

    31、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;return 0;/不需要不需要cleanup函数函数 v在创建一个对象时,可以用一个同类的对象对其初始化。这是需要调用一个特殊的构造函数,称为拷贝构造函数。v拷贝构造函数以一个同类对象引用作为参数,它的原型为:类名(const&);v用户可以根据自己的需要定义拷贝构造函数v如果用户没有定义拷贝构造函数,系统会定义一个缺省的拷贝构造函数。该函数将已存在的对象

    32、原式原样地复制给新成员Classname(const classname&ob)/.例:Class point int x,y;public:point(int a,int b)x=a;y=b;point(const point&p)x=2*p.x;y=2*p.y;v一般情况下,默认的拷贝构造函数足以满足要求。v但某些情况下可能需要设计自己的拷贝构造函数。v例如,我们希望对IntArray类增加一个功能,能够定义一个和另一个数组完全一样的数组。但默认的拷贝构造函数却不能胜任。如果正在构造的对象为arr1,作为参数的对象是arr2,调用默认的拷贝构造函数相当于执行下列操作:arr1.low=ar

    33、r2.low;arr1.high=arr2.high;arr1.storage=arr2.storage;前两个操作没有问题,第三个操作中,storage是一个指针,第三个操作意味着使arr1的storage指针和arr2的storage指针指向同一块空间。v一个对象的修改将会影响另一个对象v如果两个对象的作用域不同,当一个对象析构时,另一个对象也将丧失它的空间IntArray(const IntArray&arr)low=arr.low;high=arr.high;storage=new int high low+1;for(int i=0;i high low+1;+i)storagei=

    34、arr.storagei;v对象定义时 v把对象作为参数传给函数时 v把对象作为返回值时 v拷贝构造函数用于对象构造时有两种用法:直接初始化和拷贝初始化。v直接初始化将初始值放在圆括号中,直接调用与实参类型相匹配的构造函数。如 IntArray array2(array1);v拷贝初始化是用“=”符号。当使用拷贝初始化时,首先会用“=”右边的表达式构造一个临时对象,再调用拷贝构造函数将临时对象复制到正在构造的对象。如 IntArray array=IntArray(20,30);class point int x,y;public:point(int a,int b)x=a;y=b;point

    35、(const point&p)x=2*p.x;y=2*p.y;void print()coutx yendl;void main()point p1(10,20),p2(p1),p3=p1,p4(1,2);p1.print();p2.print();p3.print();p4.print();p4=p1;p4.print();10 2020 4020 401210 20v如有函数:void f(IntArray array);v函数调用 f(arr);将创建一个形式参数对象array,并调用拷贝构造函数用对象arr初始化arrayv如有函数 IntArray f()IntArray a;ret

    36、urn a;v当执行到return语句时,会创建一个IntArray类的临时对象,并调用拷贝构造函数用对象a初始化该临时对象,并将此临时对象的值作为返回值。Time gTime;int main()Time lTime1;static Time sTime;Time lTime2;创建顺序:遇到变量定义时调用构造函数1、gTime构造函数 2、lTime1构造函数 3、sTime构造函数 4、lTime2构造函数Time gTime;int main()Time lTime1;static Time sTime;Time lTime2;消失顺序:1、局部变量先消失,然后是静态局部变量,最后是全

    37、局变量;2、后创建的先消失;1、lTime2析造函数 2、lTime1析造函数3、sTime析造函数 4、gTime2析造函数class CreateAndDestroy public:CreateAndDestroy(int,string);/constructor CreateAndDestroy();/destructorprivate:int objectID;/ID number for object string message;/message describing object;/end class CreateAndDestroyCreateAndDestroy:Create

    38、AndDestroy(int ID,string messageString)objectID=ID;message=messageString;cout Object objectID constructor runs message endl;CreateAndDestroy:CreateAndDestroy()cout (objectID=1|objectID=6?n:);cout Object objectID destructor runs message endl;CreateAndDestroy first(1,(global before main);int main()cou

    39、t nMAIN FUNCTION:EXECUTION BEGINS endl;CreateAndDestroy second(2,(local automatic in main);static CreateAndDestroy third(3,(local static in main);create();cout nMAIN FUNCTION:EXECUTION RESUMES endl;CreateAndDestroy fourth(4,(local automatic in main);cout nMAIN FUNCTION:EXECUTION ENDS endl;return 0;v

    40、oid create(void)cout nCREATE FUNCTION:EXECUTION BEGINS endl;CreateAndDestroy fifth(5,(local automatic in create);static CreateAndDestroy sixth(6,(local static in create);CreateAndDestroy seventh(7,(local automatic in create);cout nCREATE FUNCTION:EXECUTION ENDS endl;void create(void);int main()creat

    41、e();create();return 0;测试静态的局部变量void create(void)cout nCREATE FUNCTION:EXECUTION BEGINS endl;CreateAndDestroy fifth(5,(local automatic in create);static CreateAndDestroy sixth(6,(local static in create);CreateAndDestroy seventh(7,(local automatic in create);cout nCREATE FUNCTION:EXECUTION ENDS“endl;v

    42、从面向过程到面向对象 v类的定义 v对象的使用v对象的构造与析构 v常量对象与const成员函数 v常量数据成员 v静态数据成员与静态成员函数 v友元 vConst对象的定义 const MyClass obj(参数表);vConst对象不能被赋值,只能初始化,而且一定要初始化,否则无法设置它的值。v数据成员一般都由成员函数修改。当定义了一个常量对象后,如何使用这个对象?vC+规定:对const对象只能调用const成员函数v任何不修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误,这无疑会提高

    43、程序的健壮性。class A int x;public:A(int i)x=i;int getx()const return x;class A int x;public:A(int i)x=i;int getx()const;;int A:getx()const return x;必须加必须加class A int x;public:A(int i)x=i;int getx()const x=7;/错误,修改了数据成员错误,修改了数据成员x return x;v从面向过程到面向对象 v类的定义 v对象的使用v对象的构造与析构 v常量对象与const成员函数 v常量数据成员 v静态数据成员与静

    44、态成员函数 v友元 vconst数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。同一类的不同的对象其const数据成员的值可以不同。v常量成员的声明 在该成员声明前加上const。如 class abc const int x;v不能在类声明中初始化const数据成员。class A/错误,企图在类声明中初始化const数据成员const int SIZE=200;int arraySIZE;/错误,未知的SIZE;vconst数据成员的初始化只能在类构造函数的初始化表中进行,不能在构造函数中对他赋值。v例:class AA(int size);/构造函数const int S

    45、IZE;A:A(int size):SIZE(size)/构造函数的初始化表A a(100);/对象a的SIZE的值为100A b(200);/对象b的SIZE的值为200v从面向过程到面向对象 v类的定义 v对象的使用v对象的构造与析构 v常量对象与const成员函数 v常量数据成员 v静态数据成员与静态成员函数 v友元 v假设类SavingAccount专门用于存放存款帐户,它包括存户的姓名、地址、存款额、利率等成员变量:class SavingAccountchar m_name20;/存户姓名 char m_addr60;/存户地址 double m_total;/存款额double

    46、m_rate;/利率 ;这家银行采用浮动利率,每个帐户的利息根据当天的挂牌利率计算。这时m_rate就不适合成为每个帐号一个资料,否则每天一开市,光把修改所有帐户的m_rate的值,就花掉不少时间。m_rate应该独立于各对象之外,成为整个类个对象共享的资料。v解决方法:在m_rate前面加上staticclass SavingAccountchar m_name20;/存户姓名char m_addr60;/存户地址double m_total;/存款额 static double m_rate;/利率v静态成员变量不属于对象的一部分,而是类的一部分;v静态成员变量的初始化不能放在类的构造函数

    47、中;v类定义并不分配空间,空间是在定义对象时分配v但静态数据成员属于类,因此定义对象时并不为静态成员分配空间。v为静态成员分配空间称为静态成员的定义v静态成员的定义一般出现在类的实现文件中。如在SavingAccount类的实现文件中,必须要如下的定义:double SavingAccount:rate=0.05;该定义为rate分配了空间,并给它赋了一个初值0.05。v如果没有这个定义,连接器会报告一个错误。v可以通过作用域操作符从类直接调用。如:SavingAccount:rate v但从每个对象的角度来看,它似乎又是对象的一部分,因此又可以从对象引用它。如有个SavingAccount类

    48、的对象obj,则可以用:obj.ratev由于是整个类共享的,因此不管用哪种调用方式,得到的值都是相同的 v成员函数也可以是静态的。静态的成员函数是为类的全体对象服务,而不是为某个类的特殊对象服务v由于静态成员函数不需要借助任何对象就可以被调用,所以编译器不会为它暗加一个this指针。因此,静态成员函数无法处理类中的非静态成员变量。v静态成员函数的声明只需要在类定义中的函数原型前加上保留词static。v定义静态成员函数的主要目的是访问静态的数据成员。v如在SavingAccount类中,当利率发生变化时,必须修改这个静态数据成员的值。为此可以设置一个静态的成员函数 static void S

    49、etRate(double newRate)rate=newRate;v静态成员函数可定义为内嵌的,也可在类外定义。在类外定义时,不用static。v静态成员函数的访问:可以通过类作用域限定符或通过对象访问 类名:静态成员函数名()对象名.静态成员函数名()class goods int weight;static int total_weight;public:goods(int w);goods();int weight();static int totalweight();int goods:total_weight=0;goods:goods(int w)weight=w;total_

    50、weight+=w;goods:goods()total_weight-=weight;int goods:weight()return weight;int totalweight()return total_weight;v在程序执行的某个时刻,有时需要知道某个类已创建的对象个数,现在仍存活的对象个数。v类设计:数据成员:为了实现这个功能,我们可以在类中定义两个静态的数据成员:obj_count和obj_living。成员函数:要实现计数功能,我们可以在创建一个对象时,对这两个数各加1。当撤销一个对象时,obj_living减1。为了知道某一时刻对象个数的信息,可以定义一个静态的成员函数返

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:创建功能更强的类型课件.ppt
    链接地址:https://www.163wenku.com/p-3590846.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库