C++程序结构

上传人:da****ge 文档编号:243299792 上传时间:2024-09-20 格式:PPT 页数:44 大小:4.53MB
返回 下载 相关 举报
C++程序结构_第1页
第1页 / 共44页
C++程序结构_第2页
第2页 / 共44页
C++程序结构_第3页
第3页 / 共44页
点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,面向对象程序设计,西南交通大学信息科学与技术学院,主讲教师,:,喻琇瑛,第五章,C+,程序的结构,标识符的作用域、可见性、生存期,类成员的共享与保护,5.1,标识符的作用域与可见性,作用域:,讨论的是标识符的有效范围;,可见性:,讨论的是标识符是否可以引用的问题。,二者既相互联系,但又存在着差异。,1.,作用域,定义:,是一个标识符在程序正文中有效的区域。,标识符的引入与声明有关,作用域开始于标识符的声明处。,在,C+,中,作用域包括:函数原型作用域、块作用域(局部作用域)、类作用域和文件作用域这几种。,1,),函数原型作用域,在,C+,中,最小的作用域是函数原型作用域。,在函数原型声明时形式参数的作用范围就是函数原型作用域。,例如,:,int GetScore,(,int score,);,这里,标识符,score,的作用范围(即作用域)就是在函数,GetScore,的左右括号之间,在程序的其他地方无法引用这个标识符,这里,我们将标识符,score,的作用域就称为,函数原型作用域,。,说明:,对于这种情况,形参可以省略,声明中加上形参的目的是提高程序的可读性。,5.1,标识符的作用域与可见性,(,续,1,),2,)块作用域,块:,块是一对大括号括起来的程序,。,块作用域:,当标识符的声明出现在一对花括号所括起来的一段程序(块:复合语句)内时,该标识符的作用域从声明点开始,到块结束处为止,该作用域的范围具有局部性。,void fn ( int y ),y,的作用域从此开始,int x=1,;,x,的作用域从此,开始,if (xy),cout x endl,;,else,cout y A,这样的表达式中,常用指向,C,类对象的指针来访问类的对象的成员,这里也具有类作用域。,5.1,标识符的作用域与可见性,(,续,3,),4,)文件作用域,文件作用域:在所有函数定义之外说明的,不属于前面各个作用域中出现的声明,具有文件作用域。,其作用域开始于声明点,结束于文件尾。,5.1,标识符的作用域与可见性,(,续,4,),例:,#include ,int a,;,/a,被声明为一个全局变量,具有,文件作用域,void main,(), a=5,;,/,为具有文件作用域的,a,赋初值, /,大括号中为一个子块,int a,;,/,在子块中定义了局部变量,a,,具有,块作用域,a=3,;,/,为具有块作用域的,a,赋初值,cout“a=”aendl,;, /,子块结束,cout“a=”aendl,;,/,块结束,所以只有具有文件作用域的,a,有效,输出,5,5.1,标识符的作用域与可见性,(,续,5,),2.,可见性,文件作用域,类作用域,块作用域,可见性是从标识符引用时是否可见的角度看。程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。作用域由大到小见下图:,5.1,标识符的作用域与可见性,(,续,6,),可见性的一般规则是:,标识符要先声明,后引用。,在同一作用域中,不能声明同名的标识符。,对于在不同的作用域声明的标识符,遵循的原则是:,当在,没有互相包含关系,的不同作用域中声明的同名的标识符互相不影响;,当存在,具有包含关系,的两个或多个作用域时,在外层声明了标识符后:如果内层中,没有声明与之同名的标识符,,则外层标识符在内层可见。如果内层中,声明了与外层同名的标识符,,则外层标识符在内层不可见。(例如:前面的例,5-1,),如果被隐藏的是全局变量,则可用符号“:”来引用该全局变量。,5.1,标识符的作用域与可见性,(,续,7,完),5 . 2,生存期,生存期:,变量和对象从产生到结束的这段时间就称为生存期。在生存期内,对象保持其状态,变量保持其值。,1,)静态生存期:,变量在固定的数据区中分配空间的,具有静态生命期。或者说:如果对象的生存期与程序的运行期相同,称其具有静态生存期。,通常有两种情况下,对象具有静态生存期:,在文件作用域中声明的对象,在函数内部的块作用域中用,static,关键字声明的对象。例如:,static int score,;,说明:,静态生命期的变量,若无显式初始化,则自动初始化为,0,。,函数驻在代码区,也具有静态生存期。在函数内部可以声明静态生存期的变量,即静态局部变量(加,static,)。,5 . 2,生存期(续,1,),2,)局部生存期:,在,函数内部声明,的变量或者是,块中,声明的变量具有局部生存期。这种变量的生存期开始于程序执行经过其声明点时,而结束于其作用域结束处。,说明:,具有局部生存期的变量驻在内存的栈区。,具有局部生存期的变量如果未被初始化,则内容不可知。,5 . 2,生存期(续,2,),#include ,int i=1,;,/i,为全局变量,具有文件作用域,静态生存期,void main(void),static int a,;,/a,为静态局部变量,具有全局寿命,局部可见,int b=-10,;,int c=0,;,void other(void),;,cout-MAIN-n,;,couti:ia:ab:bc:cendl,;,/,第一次,c=c+8,;,other(),;,/,调用,other,cout-MAIN-n,;,couti:ia,:,ab,:,bc,:,cendl,;,i=i+10,;,other(),;,/,调用,other,5 . 2,生存期(续,3,),void other(void),static int a=2,;,static int b,;,int c=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,),3,)动态生命期,:,这种生命期由程序中特定的函数调用,(malloc,()和,free,()或操作符,(new,和,delete),来创建和释放。,具有这种生命期的变量驻在内存的堆中。当用函数,malloc,()或,new,为变量分配空间时,生命期开始,当用,free,()或,delete,释放该变量的空间或程序结束时,生命期结束。,5 . 2,生存期(续,5,完),5 . 3,数据与函数,数据和函数的关系包括:函数读数据的,访问权限,、函数之间的,数据共享,以及对共享数据的,保护,。,在,C+,中,一般可以通过局部变量、全局变量、类的数据成员、类的静态成员以及友元来实现函数之间的数据共享。,1,、局部变量,通常,定义于函数内部的变量称为局部变量,一般来说就是具有块作用域的变量。块作用域的范围是从变量定义处开始,到块的结束处为止。,作用:由于变量具有局部作用域,因此在不同函数体内的局部变量是互相不可见的,这就很好的实现了函数之间的数据隐蔽。,2,、全局变量,通常,定义于函数外部的变量称为全局变量。,作用:,将数据存放在全局变量中,不同的函数在不同的地方可以对同一个全局变量进行访问,实现了这些函数之间的数据共享。,5 . 3,数据与函数(续,1,),3,、数据成员,在结构化程序设计中,只有参数传递和全局变量这两种方式来实现数据共享,而在,C+,中,还可以通过数据成员实现数据的隐藏和共享。,类的成员包括了函数成员和数据成员。类的数据成员可以被同类中的任何函数访问,从而在类的内部函数之间实现了数据的共享。,作用,:实现了共享和隐藏的两全。一方面在类内部函数之间实现了数据的共享,另一方面可以适当设置访问控制属性,限制这种共享,将共享限制在类的范围之内。,5 . 3,数据与函数(续,2,完),5 . 4,静态成员,class student,private,:,int studentNo,:,char *name,;,.,问题:如何统计学生总数?,如果用类外的变量存储总数,不能实现数据的隐藏;,如果在类中增加一个数据成员来存放总数,那么每个对象都会存储一个副本,就会产生冗余,而且每个对分别维护一个“总数”,将造成数据的不一致性。,静态成员的内存,区,对象,1,对象,2,对象,3,对象,4,对象,5,对象,6,分两种:,静态数据成员,静态函数成员,5 . 4,静态成员(续,1,),1,、静态数据成员,对比,:,类的普通数据成员:在每个对象中都拥有一个拷贝,即每个对象的同名数据成员可以分别存储不同数值;,类的静态数据成员:以,static,关键字来声明,每个类只有一个拷贝,这个类的所有对象共同维护使用这个拷贝,从而实现同一类的不同对象之间的数据共享。,静态数据成员的声明,:,在类的声明中对静态数据成员进行引用性说明,,必须在文件作用域的某个地方使用类名限定进行定义性说明,同时可以进行初始化。,注意:,静态数据成员在声明时如果没有赋初值,系统会自动为其赋初值为,0,。,5 . 4,静态成员(续,2,),例:,#include ,class point,public,:,point,(,int xx=0,int yy=0,),x=xx,;,y=yy,;,countP+,;,point,(,point &p,);,int getX,(),return x,;,void getC,(),coutobject id,:,countPendl,;,private,:,int x,y,;,static int countP,;,;,5 . 4,静态成员(续,3,),point,:,point,(,point &p,),/,拷贝构造,x=p.x,;,y=p.y,;,countP+,;,int point,:,countP=0,;,void main,(),point A,(,4,5,);,cout,A,:,endl,;,A.getC,();,Point B,(,A,);,coutB,:,endl,;,B.getC,();,运行结果:,A,:,Object id,:,1,B,Object id,:,2,对静态数据成员的定义性说明和初始化,不能缺少,5 . 4,静态成员(续,4,),2,、静态函数成员,优点,:,不依赖于任何对象,可以直接访问静态数据。,1,)访问静态数据,5 . 4,静态成员(续,5,),#include ,classs Point,public,:,Point,(,int xx=0,,,int yy=0,),X=xx,;,Y=yy,;,countP+,;,Point,(,Point &p,);,int getX,(),return X,;,int getY,(),return Y,;,static void getC,(),cout“object id is ”countPendl,;,/,静态函数成员,将原例中的,getC,()改为了,static,private,:,int X,,,Y,;,static int countP,;,/,静态数据成员引用性说明,;,5 . 4,静态成员(续,6,),Point,:,Point,(,Point &p,),X=p.X,;,Y=p.Y,;,CountP+,;,int Point,:,countP=0,;,void main,(),Point A,(,4,,,5,);,Cout“Point A,,”,A.getX,(),“,,”,A.getY,();,A.getC,();,Point B,(,A,);,Cout“Point B,,”,B.getX,(),“,,”,B.getY,();,Point,:,getC,();,/,利用类名引用,输出对象号,不需要用对象名来引用,5 . 4,静态成员(续,7,),2,)访问非静态数据成员,静态成员函数可以直接访问该类的静态数据和函数成员;,如果要访问非静态数据成员,则必须通过参数传递方式得到对象名,然后通过对象名来访问,。,5 . 4,静态成员(续,8,),例:,class point,public,:,static void f,(,point a,);,private,:,int x,,,y,;,;,void point,:,f,(,point a,),coutx,;,/,错误,不能直接对,x,进行引用,couta.x,;,/,正确,5 . 4,静态成员(续,9,完),5 . 5,友元,1.,友元函数,友元函数,:是在类声明中由关键字,friend,修饰的,非成员函数,。,友元函数的特点,:,是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。下面举一例子说明友元函数的应用。,注意,:,友元函数可以是一个普通函数或其他类的成员函数,,它不是本类的成员函数,,但在友元函数体中可以通过对象名访问类的私有和保护成员。,例,1,:,class Point,public,:,Point,(,double xx,,,double yy,), x=xx,;,y=yy,;,double Getx,();,friend double Distance,(,Point &a, Point &b,);,/,声明友元函数,private,:,double x,,,y,;,;,double Point,:,Getx,(), return x,;,double Distance,(,Point &a,,,Point &b,),double dx =a.x-b.x,;,double dy=a.y-b.y,;,return sqrt,(,dx*dx+dy*dy,);,直接访问,私有数据,5 . 5,友元(续,1,),void main,(),Point p1,(,3.0,,,4.0,),,p2,(,6.0,,,8.0,);,p1.Getxy,();,p2.Getxy,();,double d=Distance,(,p1,,,p2,);,coutDistance isdendl,;,注意,,Distance,是一个外部函数,而不是类,point,的公有函数,所以这里直接调用,5 . 5,友元(续,2,),2.,友元类,友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。,语法形式:,class B,.,friend class A,;,/,声明,A,类为,B,类的友元类,.,;,5 . 5,友元(续,3,),例,# include ,class A, friend class B,;,/,声明,B,为,A,类的友元,public,:,void display,(),coutxendl,;,int getx,(),return x,;,private,:,int x,;,;,5 . 5,友元(续,4,),class B, public,:,void set,(,int i,);,void display,();,private,:,A a,;,;,void B,:,set,(,int i,),a.x=i,;,cout,a.x,endl,;,由于,B,是,A,的友元,所以其成员函数中可以访问,A,类对象的私有成员;,5 . 5,友元(续,5,),注意,友元关系是单向的,不继承,不传递,5 . 5,友元(续,6,),5.6,共享数据的保护,问题,:在,C+,中,我们以数据隐藏来保证数据的安全性,但同时又采取各种方式进行数据共享,破坏了数据的安全性。,解决,:,对于既需要共享、又需要防止改变的数据应该声明为常量进行保护,因为常量在程序运行期间是不可改变的。,下面分别,介绍,常引用、常对象和对象的常成员。,5.6,共享数据的保护,(续,1,),1.,常引用,使用,const,修饰符可以说明为常引用,,常引用,所引用的对象不能被更新。其定义格式如下:,const &,例如,:,const double & v,;,例,P140,例,5-7,在实际应用中,常指针和常引用往往用来做函数的形参,这样的参数称为常参数。,2.,常对象,常对象,是指对象常量,定义格式如下:, const ,或者,const ,例:,class clock,. ,clock const myclock,(,0,,,0,,,0,);,定义常对象时,同样要进行初始化,并且该对象不能再被更新,修饰符,const,可放在类名后面,也可放在前面。,注意,:,常对象必须进行初始化,常对象不能被更新,常对象,5.6,共享数据的保护,(续,2,),3.,用,const,修饰的类成员,1,),常成员函数,使用,const,关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用,const,关键字说明的成员函数不能用来操作常对象。所以,所有的门对常对象都是关闭的,只有常成员函数是为常对象所提供的门(接口)。,常成员函数语法形式,:, ,(,),const,;,其中,,const,是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带,const,关键字。下面举一例子说明常成员函数的特征。,5.6,共享数据的保护,(续,3,),5.6,共享数据的保护,(续,4,),2,)常数据成员,类型修饰符,const,不仅可以说明成员函数,也可以说明数据成员。,由于,const,类型对象必须被初始化,并且不能更新,,,因此,,,在类中说明了,const,数据成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。,5.6,共享数据的保护,(续,5,),class A,public,:,A,(,int i,);,void print,();,const int &r,;,private,:,const int a,;,static const int b,;,;,const int A,:,b=10,;,A:A,(,int i,):,a,(,i,),,r,(,a,),void A,:,print,(),couta“:b“:rendl,;,void main,(),A a1,(,100,),,a2,(,0,);,a1.print,();,a2.print,();,运行结果为:,100,:,10,:,100,0,:,10,:,0,作 业,理解实例,5-11,并上机调试,5.11,,,5.12,,,5.14,Thank You !,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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