C++程序结构ppt课件_第1页
C++程序结构ppt课件_第2页
C++程序结构ppt课件_第3页
C++程序结构ppt课件_第4页
C++程序结构ppt课件_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计,西南交通大学信息科学与技术学院主讲教师:喻琇瑛,第五章C+程序的结构,标识符的作用域、可见性、生存期类成员的共享与保护,2,5.1标识符的作用域与可见性,作用域:讨论的是标识符的有效范围;可见性:讨论的是标识符是否可以引用的问题。二者既相互联系,但又存在着差异。1.作用域定义:是一个标识符在程序正文中有效的区域。标识符的引入与声明有关,作用域开始于标识符的声明处。在C+中,作用域包括:函数原型作用域、块作用域(局部作用域)、类作用域和文件作用域这几种。,3,1)函数原型作用域,在C+中,最小的作用域是函数原型作用域。在函数原型声明时形式参数的作用范围就是函数原型作用域。例如:intGetScore(intscore);这里,标识符score的作用范围(即作用域)就是在函数GetScore的左右括号之间,在程序的其他地方无法引用这个标识符,这里,我们将标识符score的作用域就称为函数原型作用域。说明:对于这种情况,形参可以省略,声明中加上形参的目的是提高程序的可读性。,5.1标识符的作用域与可见性(续1),4,2)块作用域,块:块是一对大括号括起来的程序。块作用域:当标识符的声明出现在一对花括号所括起来的一段程序(块:复合语句)内时,该标识符的作用域从声明点开始,到块结束处为止,该作用域的范围具有局部性。,voidfn(inty)y的作用域从此开始intx=1;x的作用域从此开始if(xy)coutxendl;elsecoutyA这样的表达式中,常用指向C类对象的指针来访问类的对象的成员,这里也具有类作用域。,5.1标识符的作用域与可见性(续3),6,4)文件作用域,文件作用域:在所有函数定义之外说明的,不属于前面各个作用域中出现的声明,具有文件作用域。其作用域开始于声明点,结束于文件尾。,5.1标识符的作用域与可见性(续4),7,例:,#includeinta;/a被声明为一个全局变量,具有文件作用域voidmain()a=5;/为具有文件作用域的a赋初值/大括号中为一个子块inta;/在子块中定义了局部变量a,具有块作用域a=3;/为具有块作用域的a赋初值cout“a=”aendl;/子块结束cout“a=”aendl;/块结束,所以只有具有文件作用域的a有效,输出5,5.1标识符的作用域与可见性(续5),8,2.可见性,可见性是从标识符引用时是否可见的角度看。程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。作用域由大到小见下图:,5.1标识符的作用域与可见性(续6),9,可见性的一般规则是:,标识符要先声明,后引用。在同一作用域中,不能声明同名的标识符。对于在不同的作用域声明的标识符,遵循的原则是:当在没有互相包含关系的不同作用域中声明的同名的标识符互相不影响;当存在具有包含关系的两个或多个作用域时,在外层声明了标识符后:如果内层中没有声明与之同名的标识符,则外层标识符在内层可见。如果内层中声明了与外层同名的标识符,则外层标识符在内层不可见。(例如:前面的例5-1)如果被隐藏的是全局变量,则可用符号“:”来引用该全局变量。,5.1标识符的作用域与可见性(续7完),10,5.2生存期,生存期:变量和对象从产生到结束的这段时间就称为生存期。在生存期内,对象保持其状态,变量保持其值。1)静态生存期:变量在固定的数据区中分配空间的,具有静态生命期。或者说:如果对象的生存期与程序的运行期相同,称其具有静态生存期。,11,通常有两种情况下,对象具有静态生存期:在文件作用域中声明的对象在函数内部的块作用域中用static关键字声明的对象。例如:staticintscore;说明:静态生命期的变量,若无显式初始化,则自动初始化为0。函数驻在代码区,也具有静态生存期。在函数内部可以声明静态生存期的变量,即静态局部变量(加static)。,5.2生存期(续1),12,2)局部生存期:在函数内部声明的变量或者是块中声明的变量具有局部生存期。这种变量的生存期开始于程序执行经过其声明点时,而结束于其作用域结束处。说明:具有局部生存期的变量驻在内存的栈区。具有局部生存期的变量如果未被初始化,则内容不可知。,5.2生存期(续2),13,#includeinti=1;/i为全局变量,具有文件作用域,静态生存期voidmain(void)staticinta;/a为静态局部变量,具有全局寿命,局部可见intb=-10;intc=0;voidother(void);cout-MAIN-n;couti:ia:ab:bc:cendl;/第一次c=c+8;other();/调用othercout-MAIN-n;couti:ia:ab:bc:cendl;i=i+10;other();/调用other,5.2生存期(续3),14,voidother(void)staticinta=2;staticintb;intc=10;/c为局部变量,每次进入函数时都被初始化a=a+2;i=i+32;c=c+5;cout-OTHER-n;couti:ia:ab:bc:cendl;b=a;,a,b为静态局部变量,具有全局寿命,静态生存期,局部可见,只在第一次进入函数时被初始化,5.2生存期(续4),15,3)动态生命期:这种生命期由程序中特定的函数调用(malloc()和free()或操作符(new和delete)来创建和释放。具有这种生命期的变量驻在内存的堆中。当用函数malloc()或new为变量分配空间时,生命期开始,当用free()或delete释放该变量的空间或程序结束时,生命期结束。,5.2生存期(续5完),16,5.3数据与函数,数据和函数的关系包括:函数读数据的访问权限、函数之间的数据共享以及对共享数据的保护。在C+中,一般可以通过局部变量、全局变量、类的数据成员、类的静态成员以及友元来实现函数之间的数据共享。,1、局部变量通常,定义于函数内部的变量称为局部变量,一般来说就是具有块作用域的变量。块作用域的范围是从变量定义处开始,到块的结束处为止。作用:由于变量具有局部作用域,因此在不同函数体内的局部变量是互相不可见的,这就很好的实现了函数之间的数据隐蔽。,17,2、全局变量,通常,定义于函数外部的变量称为全局变量。作用:将数据存放在全局变量中,不同的函数在不同的地方可以对同一个全局变量进行访问,实现了这些函数之间的数据共享。,5.3数据与函数(续1),18,3、数据成员,在结构化程序设计中,只有参数传递和全局变量这两种方式来实现数据共享,而在C+中,还可以通过数据成员实现数据的隐藏和共享。类的成员包括了函数成员和数据成员。类的数据成员可以被同类中的任何函数访问,从而在类的内部函数之间实现了数据的共享。作用:实现了共享和隐藏的两全。一方面在类内部函数之间实现了数据的共享,另一方面可以适当设置访问控制属性,限制这种共享,将共享限制在类的范围之内。,5.3数据与函数(续2完),19,5.4静态成员,classstudentprivate:intstudentNo:char*name;.问题:如何统计学生总数?如果用类外的变量存储总数,不能实现数据的隐藏;如果在类中增加一个数据成员来存放总数,那么每个对象都会存储一个副本,就会产生冗余,而且每个对分别维护一个“总数”,将造成数据的不一致性。,20,分两种:静态数据成员静态函数成员,5.4静态成员(续1),21,1、静态数据成员对比:类的普通数据成员:在每个对象中都拥有一个拷贝,即每个对象的同名数据成员可以分别存储不同数值;类的静态数据成员:以static关键字来声明,每个类只有一个拷贝,这个类的所有对象共同维护使用这个拷贝,从而实现同一类的不同对象之间的数据共享。静态数据成员的声明:在类的声明中对静态数据成员进行引用性说明,必须在文件作用域的某个地方使用类名限定进行定义性说明,同时可以进行初始化。注意:静态数据成员在声明时如果没有赋初值,系统会自动为其赋初值为0。,5.4静态成员(续2),22,例:,#includeclasspointpublic:point(intxx=0,intyy=0)x=xx;y=yy;countP+;point(point&p);intgetX()returnx;voidgetC()coutobjectid:countPendl;private:intx,y;staticintcountP;,5.4静态成员(续3),23,point:point(point&p)/拷贝构造x=p.x;y=p.y;countP+;intpoint:countP=0;voidmain()pointA(4,5);coutA:endl;A.getC();PointB(A);coutB:endl;B.getC();,运行结果:A:Objectid:1BObjectid:2,对静态数据成员的定义性说明和初始化,不能缺少,5.4静态成员(续4),24,2、静态函数成员,优点:不依赖于任何对象,可以直接访问静态数据。1)访问静态数据,5.4静态成员(续5),25,#includeclasssPointpublic:Point(intxx=0,intyy=0)X=xx;Y=yy;countP+;Point(Point&p);intgetX()returnX;intgetY()returnY;staticvoidgetC()cout“objectidis”countPendl;/静态函数成员,将原例中的getC()改为了staticprivate:intX,Y;staticintcountP;/静态数据成员引用性说明;,5.4静态成员(续6),26,Point:Point(Point&p)X=p.X;Y=p.Y;CountP+;intPoint:countP=0;voidmain()PointA(4,5);Cout“PointA,”A.getX()“,”A.getY();A.getC();PointB(A);Cout“PointB,”B.getX()“,”B.getY();Point:getC();/利用类名引用,输出对象号,不需要用对象名来引用,5.4静态成员(续7),27,2)访问非静态数据成员静态成员函数可以直接访问该类的静态数据和函数成员;如果要访问非静态数据成员,则必须通过参数传递方式得到对象名,然后通过对象名来访问。,5.4静态成员(续8),28,例:,classpointpublic:staticvoidf(pointa);private:intx,y;voidpoint:f(pointa)coutx;/错误,不能直接对x进行引用couta.x;/正确,5.4静态成员(续9完),29,5.5友元,1.友元函数友元函数:是在类声明中由关键字friend修饰的非成员函数。友元函数的特点:是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。下面举一例子说明友元函数的应用。注意:友元函数可以是一个普通函数或其他类的成员函数,它不是本类的成员函数,但在友元函数体中可以通过对象名访问类的私有和保护成员。,30,例1:classPointpublic:Point(doublexx,doubleyy)x=xx;y=yy;doubleGetx();frienddoubleDistance(Point&a,Point&b);/声明友元函数private:doublex,y;doublePoint:Getx()returnx;doubleDistance(Point&a,Point&b)doubledx=a.x-b.x;doubledy=a.y-b.y;returnsqrt(dx*dx+dy*dy);,直接访问私有数据,5.5友元(续1),31,voidmain()Pointp1(3.0,4.0),p2(6.0,8.0);p1.Getxy();p2.Getxy();doubled=Distance(p1,p2);coutDistanceisdendl;,注意,Distance是一个外部函数,而不是类point的公有函数,所以这里直接调用,5.5友元(续2),32,2.友元类,友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。语法形式:classB.friendclassA;/声明A类为B类的友元类.;,5.5友元(续3),33,例,#includeclassAfriendclassB;/声明B为A类的友元public:voiddisplay()coutxendl;intgetx()returnx;private:intx;,5.5友元(续4),34,classBpublic:voidset(inti);voiddisplay();private:Aa;voidB:set(inti)a.x=i;couta.xendl;,由于B是A的友元,所以其成员函数中可以访问A类对象的私有成员;,5.5友元(续5),35,注意,友元关系是单向的,不继承,不传递,5.5友元(续6),36,5.6共享数据的保护,问题:在C+中,我们以数据隐藏来保证数据的安全性,但同时又采取各种方式进行数据共享,破坏了数据的安全性。解决:对于既需要共享、又需要防止改变的数据应该声明为常量进行保护,因为常量在程序运行期间是不可改变的。下面分别介绍常引用、常对象和对象的常成员。,37,5.6共享数据的保护(续1),1.常引用使用const修饰符可以说明为常引用,常引用所引用的对象不能被更新。其定义格式如下:const&例如:constdouble&v;例P140例5-7在实际应用中,常指针和常引用往往用来做函数的形参,这样的参数称为常参数。,38,2.常对象常对象是指对象常量,定义格式如下:const或者const例:classclock.clockconstmyclock(0,0,0);定义常对象时,同样要进行初始化,并且该对象不能再被更新,修饰符const可放在类名后面,也可放在前面。注意:常对象必须进行初始化常对象不能被更新常对象,5.6共享数据的保护(续2),39,3

温馨提示

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

评论

0/150

提交评论