45954-00郭炜-新标准C程序设计2 类和对象1_第1页
45954-00郭炜-新标准C程序设计2 类和对象1_第2页
45954-00郭炜-新标准C程序设计2 类和对象1_第3页
45954-00郭炜-新标准C程序设计2 类和对象1_第4页
45954-00郭炜-新标准C程序设计2 类和对象1_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

程序设计实习,郭炜微博,1,信息科学技术学院程序设计实习郭炜,结构化程序设计,信息科学技术学院程序设计实习郭炜,内蒙古锡盟草原,C语言使用结构化程序设计:程序=数据结构+算法程序由全局变量以及众多相互调用的函数组成。算法以函数的形式实现,用于对数据结构进行操作。,结构化程序设计,Sub1_1(),Sub3_1(),Sub3_2(),结构化程序设计的程序模式:,结构化程序设计中,函数和其所操作的数据结构,没有直观的联系。随着程序规模的增加,程序逐渐难以理解,很难一下子看出来:某个数据结构到底有哪些函数可以对它进行操作?某个函数到底是用来操作哪些数据结构的?任何两个函数之间存在怎样的调用关系?,结构化程序设计的不足,结构化程序设计没有“封装”和“隐藏”的概念。要访问某个数据结构中的某个变量,就可以直接访问,那么当该变量的定义有改动的时候,就要把所有访问该变量的语句找出来修改,十分不利于程序的维护、扩充。难以查错,当某个数据结构的值不正确时,难以找出到底是那个函数导致的。,结构化程序设计的不足,重用:在编写某个程序时,发现其需要的某项功能,在现有的某个程序里已经有了相同或类似的实现,那么自然希望能够将那部分代码抽取出来,在新程序中使用。在结构化程序设计中,随着程序规模的增大,由于程序大量函数、变量之间的关系错综复杂,要抽取这部分代码,会变得十分困难。,结构化程序设计的不足,结构化程序设计的不足,总之,结构化的程序,在规模庞大时,会变得难以理解,难以扩充(增加新功能),难以查错,难以重用。,结构化程序设计的不足,软件业的目标是更快、更正确、更经济地建立软件。如何更高效地实现函数的复用?如何更清晰的实现变量和函数的关系?使得程序更清晰更易于修改和维护。,面向对象程序设计,信息科学技术学院程序设计实习郭炜,德国国王湖,面向对象的程序设计方法,能够较好解决上述问题。面向对象的程序=类+类+类设计程序的过程,就是设计类的过程。,面向对象的程序设计,面向对象的程序设计方法:将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性);将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构(这一步叫“抽象”)。然后,通过某种语法形式,将数据结构和操作该数据结构的函数“捆绑”在一起,形成一个“类”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系,这就是“封装”。面向对象的程序设计具有“抽象”,“封装”“继承”“多态”四个基本特点。,面向对象的程序设计,main(),面向对象的程序模式:,class1,var1Sub1()Sub1_1(),class2,var2Sub2(),class3,var3Sub3()Sub3_1()Sub3_2(),类和对象,信息科学技术学院程序设计实习郭炜,瑞士布里茨恩湖,写一个程序,输入矩形的长和宽,输出面积和周长。比如对于“矩形”这种东西,要用一个类来表示,该如何做“抽象”呢?矩形的属性就是长和宽。因此需要两个变量,分别代表长和宽。一个矩形,可以有哪些行为呢(或可以对矩形进行哪些操作)?矩形可以有设置长和宽,算面积,和算周长这三种行为(当然也可以有其他行为)。这三种行为,可以各用一个函数来实现,他们都需要用到长和宽这两个变量。,从客观事物抽象出类,将长、宽变量和设置长,宽,求面积,以及求周长的三个函数“封装”在一起,就能形成一个“矩形类”。长、宽变量成为该“矩形类”的“成员变量”,三个函数成为该类的“成员函数”。成员变量和成员函数统称为类的成员。实际上,“类”看上去就像“带函数的结构”。,从客观事物抽象出类,从客观事物抽象出类,classCRectanglepublic:intw,h;intArea()returnw*h;intPerimeter()return2*(w+h);voidInit(intw_,inth_)w=w_;h=h_;/必须有分号,从客观事物抽象出类,intmain()intw,h;CRectangler;/r是一个对象cinwh;r.Init(w,h);coutr.Area()endl”,“=”“成员名CRectangler1,r2;CRectangle*p1=/Init作用在p2指向的对象上,使用类的成员变量和成员函数,用法3:引用名.成员名CRectangler2;CRectangle,类的成员函数和类的定义分开写,classCRectanglepublic:intw,h;intArea();/成员函数仅在此处声明intPerimeter();voidInit(intw_,inth_);,intCRectangle:Area()returnw*h;intCRectangle:Perimeter()return2*(w+h);voidCRectangle:Init(intw_,inth_)w=w_;h=h_;CRectangle:说明后面的函数是CRectangle类的成员函数,而非普通函数。那么,一定要通过对象或对象的指针或对象的引用才能调用。,类的成员函数和类的定义分开写,类成员的可访问范围,信息科学技术学院程序设计实习郭炜,韩国济州岛火山口,类成员的可访问范围,在类的定义中,用下列访问范围关键字来说明类成员可被访问的范围:private:私有成员,只能在成员函数内访问public:公有成员,可以在任何地方访问protected:保护成员,以后再说以上三种关键字出现的次数和先后次序都没有限制。,定义一个类classclassNameprivate:私有属性和函数public:公有属性和函数protected:保护属性和函数;,说明类成员的可访问范围,类成员的可访问范围,如过某个成员前面没有上述关键字,则缺省地被认为是私有成员。classManintnAge;/私有成员charszName20;/私有成员public:voidSetName(char*szName)strcpy(Man:szName,szName);,类成员的可访问范围,在类的成员函数内部,能够访问:当前对象的全部属性、函数;同类其它对象的全部属性、函数。在类的成员函数以外的地方,只能够访问该类对象的公有成员。,类成员的可访问范围,classCEmployeeprivate:charszName30;/名字public:intsalary;/工资voidsetName(char*name);voidgetName(char*name);voidaverageSalary(CEmployeee1,CEmployeee2);voidCEmployee:setName(char*name)strcpy(szName,name);/okvoidCEmployee:getName(char*name)strcpy(name,szName);/ok,voidCEmployee:averageSalary(CEmployeee1,CEmployeee2)coute1.szName;/ok,访问同类其他对象私有成员salary=(e1.salary+e2.salary)/2;intmain()CEmployeee;strcpy(e.szName,Tom1234567889);/编译错,不能访问私有成员e.setName(Tom);/oke.salary=5000;/okreturn0;,intmain()CEmployeee;strcpy(e.szName,Tom1234567889);/编译错,不能访问私有成员e.setName(Tom);/oke.salary=5000;/okreturn0;设置私有成员的机制,叫“隐藏”“隐藏”的目的是强制对成员变量的访问一定要通过成员函数进行,那么以后成员变量的类型等属性修改后,只需要更改成员函数即可。否则,所有直接访问成员变量的语句都需要修改。,如果将上面的程序移植到内存空间紧张的手持设备上,希望将szName改为charszName5,若szName不是私有,那么就要找出所有类似strcpy(e.szName,Tom1234567889);这样的语句进行修改,以防止数组越界。这样做很麻烦。,“隐藏”的作用,如果将szName变为私有,那么程序中就不可能出现(除非在类的内部)strcpy(e.szName,Tom1234567889);这样的语句,所有对szName的访问都是通过成员函数来进行,比如:e.setName(“Tom12345678909887”);那么,就算szName改短了,上面的语句也不需要找出来修改,只要改setName成员函数,在里面确保不越界就可以了。,“隐藏”的作用,成员函数的重载及参数缺省,信息科学技术学院程序设计实习郭炜,内蒙古阿斯哈图石林,成员函数也可以重载成员函数可以带缺省参数。#includeusingnamespacestd;classLocationprivate:intx,y;public:voidinit(intx=0,inty=0);voidvalueX(intval)x=val;intvalueX()returnx;,成员函数的重载及参数缺省,成员函数也可以重载成员函数可以带缺省参数。voidLocation:init(intX,intY)x=X;y=Y;,成员函数的重载及参数缺省,intmain()LocationA,B;A.init(5);A.valueX(5);coutA.valueX();return0;输出:5,使用缺省参数要注意避免有函数重载时的二义性classLocationprivate:intx,y;public:voidinit(intx=0,inty=0);voidvalueX(intval=0)x=val;intvalueX()returnx;LocationA;A.valueX();/错误,编译器无法判断调用哪个valueX,构造函数(constructor),信息科学技术学院程序设计实习郭炜,美国加州太浩湖,基本概念(教材P179),成员函数的一种名字与类名相同,可以有参数,不能有返回值(void也不行)作用是对对象进行初始化,如给成员变量赋初值如果定义类时没写构造函数,则编译器生成一个默认的无参数的构造函数默认构造函数无参数,不做任何操作,43,基本概念,如果定义了构造函数,则编译器不生成默认的无参数的构造函数对象生成时构造函数自动被调用。对象一旦生成,就再也不能在其上执行构造函数一个类可以有多个构造函数,44,基本概念,为什么需要构造函数:1)构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用担心忘记调用初始化函数。,45,基本概念,为什么需要构造函数:1)构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用担心忘记调用初始化函数。2)有时对象没被初始化就使用,会导致程序出错。,46,classComplexprivate:doublereal,imag;public:voidSet(doubler,doublei);/编译器自动生成默认构造函数Complexc1;/默认构造函数被调用Complex*pc=newComplex;/默认构造函数被调用,47,classComplexprivate:doublereal,imag;public:Complex(doubler,doublei=0);Complex:Complex(doubler,doublei)real=r;imag=i;Complexc1;/error,缺少构造函数的参数Complex*pc=newComplex;/error,没有参数Complexc1(2);/OKComplexc1(2,4),c2(3,5);Complex*pc=newComplex(3,4);,48,可以有多个构造函数,参数个数或类型不同classComplexprivate:doublereal,imag;public:voidSet(doubler,doublei);Complex(doubler,doublei);Complex(doubler);Complex(Complexc1,Complexc2);Complex:Complex(doubler,doublei)real=r;imag=i;,49,Complex:Complex(doubler)real=r;imag=0;Complex:Complex(Complexc1,Complexc2);real=c1.real+c2.real;imag=c1.imag+c2.imag;Complexc1(3),c2(1,0),c3(c1,c2);/c1=3,0,c2=1,0,c3=4,0;,50,构造函数最好是public的,private构造函数不能直接用来初始化对象classCSampleprivate:CSample();intmain()CSampleObj;/err.唯一构造函数是privatereturn0;,51,信息科学技术学院程序设计实习郭炜,有类A如下定义:classAintv;public:A(intn)v=n;下面哪条语句是编译不会出错的?A)Aa1(3);B)Aa2;C)A*p=newA();,52,信息科学技术学院程序设计实习郭炜,有类A如下定义:classAintv;public:A(intn)v=n;下面哪条语句是编译不会出错的?A)Aa1(3);B)Aa2;C)A*p=newA();,答案:A,53,构造函数在数组中的使用,信息科学技术学院程序设计实习郭炜,内蒙古阿斯哈图石林,classCSampleintx;public:CSample()coutConstructor1Calledendl;CSample(intn)x=n;coutConstructor2Calledendl;,构造函数在数组中的使用,55,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,56,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,输出:Constructor1CalledConstructor1Called,57,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,输出:Constructor1CalledConstructor1Calledstep1,58,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,输出:Constructor1CalledConstructor1Calledstep1Constructor2CalledConstructor2Called,59,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,输出:Constructor1CalledConstructor1Calledstep1Constructor2CalledConstructor2Calledstep2,60,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,输出:Constructor1CalledConstructor1Calledstep1Constructor2CalledConstructor2Calledstep2Constructor2CalledConstructor1Called,61,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,输出:Constructor1CalledConstructor1Calledstep1Constructor2CalledConstructor2Calledstep2Constructor2CalledConstructor1Calledstep3,62,intmain()CSamplearray12;coutstep1endl;CSamplearray22=4,5;coutstep2endl;CSamplearray32=3;coutstep3endl;CSample*array4=newCSample2;deletearray4;return0;,输出:Constructor1CalledConstructor1Calledstep1Constructor2CalledConstructor2Calledstep2Constructor2CalledConstructor1Calledstep3Constructor1CalledConstructor1Called,63,classTestpublic:Test(intn)/(1)Test(intn,intm)/(2)Test()/(3);Testarray13=1,Test(1,2);,构造函数在数组中的使用,64,classTestpublic:Test(intn)/(1)Test(intn,intm)/(2)Test()/(3);Testarray13=1,Test(1,2);/三个元素分别用(1),(2),(3)初始化,构造函数在数组中的使用,65,classTestpublic:Test(intn)/(1)Test(intn,intm)/(2)Test()/(3);Testarr

温馨提示

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

评论

0/150

提交评论