面向对象编程技术第五章优秀课件.ppt

上传人:石*** 文档编号:50067812 上传时间:2022-10-12 格式:PPT 页数:60 大小:6.35MB
返回 下载 相关 举报
面向对象编程技术第五章优秀课件.ppt_第1页
第1页 / 共60页
面向对象编程技术第五章优秀课件.ppt_第2页
第2页 / 共60页
点击查看更多>>
资源描述

《面向对象编程技术第五章优秀课件.ppt》由会员分享,可在线阅读,更多相关《面向对象编程技术第五章优秀课件.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、面向对象编程技术第五章第1页,本讲稿共60页1.程序、软件中存在大量的实体对象程序、软件中存在大量的实体对象2.如何解决由此产生数据访问控制问题:如作用域;对象如何解决由此产生数据访问控制问题:如作用域;对象的生命周期;数据共享等等的生命周期;数据共享等等提出问题:提出问题:第2页,本讲稿共60页本章主要内容本章主要内容作用域与可见性对象的生存期数据与函数静态成员友元共享数据的保护编译预处理命令多文件结构和工程数据访问数据访问数据共享数据共享程序组织程序组织第3页,本讲稿共60页 数据访问数据访问作用域作用域1.作用域与可见性的含义。作用域与可见性的含义。作用域:指标示符在源文件中的有效作用范

2、围可见性:指标识符是否可以引用的问题。2.作用域分类作用域分类1)函数原型作用域2)块作用域:搞清块的含义,块是由界定的相对独立一段程序空间3)类作用域:4)文件作用域:联系与区别联系与区别第4页,本讲稿共60页数据访问数据访问可见性可见性可见性是从对标识符的引用的角度引用的角度来谈的概念可见性表示从内层作用域向外层作用域内层作用域向外层作用域“看看”时能看见什么。如果如果标识在某处可见,则就可以就可以在该处引用引用此标识符。第5页,本讲稿共60页数据访问数据访问可见性可见性注意:注意:标识符应声明在先,引用在后。标识符应声明在先,引用在后。在同一作用域中,不能声明同名不能声明同名的标识符。如

3、果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。外层作用域的标识符在内层不可见。强龙不压地头蛇原则强龙不压地头蛇原则第6页,本讲稿共60页#includeinti;/文件作用域intmain()i=5;inti;/块作用域i=7;couti=iendl;/输出7couti=b;if(b0)static int c;.c的作用域b的作用域什么是块:什么是块:简言之,返返 回回注意:注意:块内定义的静态变量,具有”文件作用域”第9页,本讲稿共60页类作用域类作用

4、域类作用域作用于特定的成员名,类及其对象有特殊的访问和作用域规则设类X,X的对象x,成员M,X的函数成员f如f没有新定义同名标识符M,则在f可以访问M可以这样访问:X:M(大写x);x.M(小写x)ptr-M(ptr为指向对象x的指针)下页例子第10页,本讲稿共60页类作用域类作用域class Apublic:int b;Static void prt()Cout“test”;Cout“b=“bendl;可以这样访问可以这样访问Aa;a.b5;a.prt();A:prt();/如果staticprt()则正确可以的可以的Aa;a:prt();A.b=12;?返返 回回第11页,本讲稿共60页文

5、件作用域文件作用域在main()之外,且不在前三者作用域范围内的数据具有文件作用域inti,j;voidmain()请看请看 下页下页第12页,本讲稿共60页准确理解作用域整体视图准确理解作用域整体视图P123块作用域类作用域文件作用域问题:问题:1.这种包含关系什么时候成立?这种包含关系什么时候成立?2.类作用域一定包含块作用域吗?例类作用域一定包含块作用域吗?例?返返 回回第13页,本讲稿共60页main()class part_clapublic:int a;void prt();part_cla pc;/出错!此时类的作用域不包含块作用域出错!此时类的作用域不包含块作用域返返 回回第1

6、4页,本讲稿共60页数据访问数据访问对象的生存期对象的生存期对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。P124静态生存期动态生存期返返 回回第15页,本讲稿共60页静态生存期静态生存期定义:定义:生存期与程序的运行期相同,称为静态生存期在文件作用域中声明的对象具有这种生存期。在函数内部声明静态生存期对象,用关键字static声明的对象。两两种种静静态态生生存存期期示例示例第16页,本讲稿共60页#includeint i=5;/文件作用域文件作用域void out();void main()couti=iendl;out();out();voi

7、d out()static ct;+ct;coutct=ctendl;注意:注意:i,ct具有静态生存期具有静态生存期例例:返返 回回第17页,本讲稿共60页动态生存期动态生存期定义:定义:块作用域中声明的对象是动态生存期的对象(习惯称局部生存期对象)。开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。示例示例什么是作用什么是作用域?域?第18页,本讲稿共60页#includevoidfun();voidmain()fun();fun();voidfun()staticinta=1;inti=5;a+;i+;couti=i,a=aendl;运行结果:i=6,a=2i=6,a=3i是动

8、态生存期a是静态生存期例例第19页,本讲稿共60页注意:注意:1.静态生存期与程序的生成期相同,一经创建,便贯穿始终。静态生存期有局部和全局两种定义方式静态生存期有局部和全局两种定义方式2.动态生存期指临时创建,临时使用,动态内存分配3.变量的生存期与可见性的讨论可见一定生存,但生存未必可见返返 回回联系作用联系作用域域第20页,本讲稿共60页数据访问数据访问数据与函数数据与函数1.数据存储在局部对象中,通过参数传递实现共享函数间的参数传递。2.数据存储在全局对象中。3.将数据和使用数据的函数封装在类中。数据、代码结合数据、代码结合方式方式三三种种基基本本方方式式第21页,本讲稿共60页数据访

9、问数据访问静态成员静态成员为了解决同类同类中不同对象不同对象的间的数据、函数(代码)共享共享问题。静态成员的提出:静态成员的提出:包包括括静态数据成员静态函数成员如何定义如何定义第23页,本讲稿共60页数据访问数据访问静态成员静态成员静态数据成员用关键字static声明同类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化,用:域运算符域运算符来指明所属的类。静态函数成员第24页,本讲稿共60页数据访问数据访问静态成员静态成员静态函数成员用关键字static声明类外代码可以使用类名和域操作符来调用静态成员函数。静态成员函数只能引用属于该类的静态数据成员或静态静态数据成员或静态成员函数。成员

10、函数。访问非静态数据成员,必须通过本类的对象来实现。为什么?下页例子第25页,本讲稿共60页例子:例子:classapublic:staticintx;staticprt()cout“x=“x;inta:x=0;/对静态成员初始化main()a a1;a:x=12;a:prt();a1.x=15;a1.prt();通过类访问静态成员通过对象访问静态成员第26页,本讲稿共60页注意:注意:1.静态数据成员要在文件作用域中使用类名做限制性初始化。2.静态数据成员的访问方式:类名:静态数据成员或对象名.静态数据成员(与书上的叙述相悖)3.静态函数成员的访问方式:类名:静态数据成员或对象名.静态函数数

11、成员第27页,本讲稿共60页注意:注意:4.静态函数成员的访问对象:静态数据成员、静态函数成员不能访问非静态数据成员5.静态成员函数可以直接通过类名:函数名的方式访问静态数据成员,对非静态数据成员只能通过对象名来访问。参考教材P132你明白吗?看实例下页例子第28页,本讲稿共60页ClassAPublic:Staticvoidf(Aa);Private:intx;VoidA:f(Aa)/coutx;错误couta.x;/正确返返 回回原因是,静态函数成员可以通过类名访问,而此时非静态数据成员没有存储空间第29页,本讲稿共60页补充:关于静态成员的访问属性1.静态成员一般设成public访问属性

12、,否则不能以对象方式或者类名:静态成员名的方式访问2.设成public静态成员访问属性后,可以用对象名和类名:方式访问第30页,本讲稿共60页例子:例子:classApublic:staticvoidshow()coutinclassAendl;staticintstkk;/可以用对象名访问活着类名:成员名形式访问protected:/staticintstkk;类外:不予许对象名访问或者类名:成员名形式访问private:/staticintstkk;不予许对象名访问或者类名:成员名形式访问;intA:stkk=9;voidmain()Aa;a.stkk=99;couta.stkkendl;

13、coutA:stkkendl;a.show();A:show();第31页,本讲稿共60页数据共享数据共享友元友元设计思想:设计思想:友元,友元,包括友元函数友元函数和友元类友元类,是类和对象向其它类与对象开放本类、对象的的私有、保护成员的有效途径。B(A的友元)类Afriend BPrivate or protect:第32页,本讲稿共60页数据共享数据共享友元函数友元函数ClassApublic:friend函数B声明定义格式:定义格式:函数B定义第33页,本讲稿共60页例:简单友元函数例:简单友元函数classApublic:A(inti)x=i;friendvoidacc(A&a);/

14、可以不用引用可以不用引用private:intx;voidacc(A&a)/可以不用引用,如可以不用引用,如A acoutthexinAis:a.xendl;a.x=99;coutthexinAis:a.xendl;intmain()Aa(9);couta.xendl;a.x=99;acc(a);return0;第34页,本讲稿共60页例例5-6 使用友元函数计算两点距离使用友元函数计算两点距离(P135)classPoint/Point类声明public:/外部接口Point(intxx=0,intyy=0)X=xx;Y=yy;intGetX()returnX;intGetY()return

15、Y;friendfloatfDist(Pointa,Point&b);private:/私有数据成员intX,Y;第35页,本讲稿共60页doublefDist(Point&a,Point&b)doubledx=a.X-b.X;doubledy=a.Y-b.Y;returnsqrt(dx*dx+dy*dy);intmain()Pointp1(3.0,5.0),p2(4.0,6.0);doubled=Distance(p1,p2);coutThedistanceisdendl;return0;第36页,本讲稿共60页注:注:1.友元函数可以是普通函数,也可以是其它类的成员函数2.友元函数一般定义

16、在类public部分,也可以定义在private部分3.友元函数降低了类的封装性,不利于代码复用。第37页,本讲稿共60页数据共享数据共享友元类友元类若一个类为另一个类的友元,则此类的所有成员都能访则此类的所有成员都能访问对方类的私有成员问对方类的私有成员(类内类内)。声明语法:将友元类名在另一个类中使用friend修饰说明。Clas Afriend class B;Public:friend class C;Private:第38页,本讲稿共60页友元类举例class A friend class B;public:void Display()coutxyear=year;this-mout

17、h=mouth;this-day=day;voidout()coutyearmouthdayendl;private:intyear;intmouth;intday;第43页,本讲稿共60页longdis_of_day(dated1,dated2)longcalc;calc=(d1.year-d2.year)*365+(d1.mouth-d2.mouth)*30+d1.day-d2.day;returncalc;voidmain()dated1(1934,23,12),d2(1934,20,11);d1.out();d2.out();coutdis_of_day(d1,d2)endl;返返 回

18、回第44页,本讲稿共60页共享数据的保护共享数据的保护常类型常类型采用如下的共享数据保护措施采用如下的共享数据保护措施常类型的提出:常类型的提出:各种形式的数据共享破坏了数据的隐秘性、数据的封装,如何保护被共享的数据?1.常引用:被引用的对象不能被更新。2.常对象:必须进行初始化(通过构造函数),不能被更新。3.常类成员:(1)常数据成员 通过构造函数初始化 (2)常函数成员问:什么问:什么是更新?是更新?第45页,本讲稿共60页1.常引用常引用voiddisplay(constdouble&r)/常引用做形参,在函数中不能更新r所引用的对象。coutrendl;if(r=r)cout“ok”

19、endl;/r=r或r9.5;都认为错误,不许更新+r;/出错,不予许更新例:例:格式:格式:const类型说明符&引用名第46页,本讲稿共60页2.常对象举例常对象举例classApublic:intx,y;voidprt()cout“x=:x“y=:”yendl;Aconsta;/a是常对象,不能被更新main()couta.xendl;/输出默认值a.x=3;/错误,不许更新只能通过类的构造函数初始化格式:格式:类名 const对象名例例:第47页,本讲稿共60页3.1常成员函数常成员函数#includeclassRpublic:R(intr1,intr2)R1=r1;R2=r2;voi

20、dprint();voidprint()const;/构成重载构成重载private:intR1,R2;格式:格式:成员函数const常成员函数不更新对象的数据成员常对象只能调用它的常成员函数第48页,本讲稿共60页voidR:print()coutR1:R2endl;voidR:print()constcoutR1;R2endl;R1=11l;/errorvoidmain()Ra(5,4);a.print();/调用voidprint()constRb(20,52);b.print();/调用voidprint()const第49页,本讲稿共60页3.2常数据成员常数据成员classApub

21、lic:A(inti);voidprint();const int&r;private:const int a;static const int b;/静态常数据成员;格式:格式:const数据成员。常数据成员只能通过类的构造函数置初值第50页,本讲稿共60页constintA:b=10;/静态成员赋值A:A(inti):a(i),r(a)/构造函数赋值voidA:print()couta:b:rendl;voidmain()/*建立对象a和b,并以100和0作为初值,分别调用构造函数,通过构造函数的初始化列表给对象的常数据成员赋初值*/Aa1(100),a2(0);a1.print();a2

22、.print();100:10:1000:10:0输出结果输出结果第51页,本讲稿共60页注意:注意:1.常引用的所指的“对象”不能被更新2.常对象的数据成员不允许被更新,通过常对象只能调用它的常成员函数,常成员函数不更新对象的数据成员。3.常成员函数说明格式中的const是函数类型的一个组成部分,在声明、定义实现部分都要带上,constconst关键字可以形成函数重载关键字可以形成函数重载。4.常数据成员只能通过类的构造函数置初值。5.const 位置问题,除了常函数成员外,const的位置是灵活的。对比类静态成员对比类静态成员第52页,本讲稿共60页const的位置的位置1.常引用:con

23、st类型说明符const引用名2.常对象:const类名const对象名3.常数据成员const类型说明符const成员名4.常函数成员类型说明符函数名()const返返 回回特殊特殊,且是且是重载的依据重载的依据第53页,本讲稿共60页编译预处理编译预处理本节介绍与预处理相关的操作,主要包括预处理指令和预处理操作符。预处理用来扩充C+程序设计环境,所有的预处理指令由”打头。预处理指令:include、define、undef、条件编译指令if等预处理操作符:defined第54页,本讲稿共60页编译预处理命令编译预处理命令1.#include包含指令将一个源文件嵌入到当前源文件中该点处。#i

24、nclude按标准方式搜索,文件位于C+系统目录的include子目录下#include文件名首先在当前目录中搜索,若没有,再按标准方式搜索。2.#define宏定义指令定义符号常量,已被const定义语句取代。/仍然可以使用定义带参数宏,已被内联函数取代。3.#undef删除由#define定义的宏,使之不再起作用。第55页,本讲稿共60页条件编译指令#if 和#endif#if常量表达式/当“常量表达式”非零时编译程序正文#endif第56页,本讲稿共60页条件编译指令#else#if常量表达式/当“常量表达式”非零时编译程序正文1#else/当“常量表达式”为零时编译程序正文2#endif第57页,本讲稿共60页条件编译指令#elif#if常量表达式1程序正文1/当“常量表达式1”非零时编译#elif常量表达式2程序正文2/当“常量表达式2”非零时编译#else程序正文3/其它情况下编译#endif第58页,本讲稿共60页1.每条预处理指令单独占用一行单独占用一行,不加分号”;”2.学会使用条件编译指令,学会使用条件编译指令来处理可能出现的重复定义问题,如:ifndef X#define X程序正文1#endif注:注:下页例子:第59页,本讲稿共60页第60页,本讲稿共60页

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

当前位置:首页 > 生活休闲 > 资格考试

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

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