您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 作用域―可见性―生存期
前一页休息1本章主要内容作用域与可见性对象的生存期数据与函数静态成员共享数据的保护友元编译预处理命令多文件结构和工程前一页休息2函数原形的作用域函数原型中的参数,其作用域始于(,结束于)。例如,设有下列原型声明:doubleArea(doubleradius);radius的作用域仅在于此,不能用于程序正文其它地方,因而可有可无。作用域与可见性前一页休息3块作用域在块中声明的标识符,其作用域自声明处起,限于块中,例如:voidfun(inta){intb(a);cinb;if(b0){intc;......}}c的作用域b的作用域作用域与可见性前一页休息4类和文件作用域类作用域作用于特定的成员名,类及其对象有特殊的访问和作用域规则。不在前述各个作用域中出现的声明,具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件尾。作用域与可见性前一页休息5可见性可见性是从对标识符的引用的角度来谈的概念可见性表示从内层作用域向外层作用域“看”时能看见什么。如果标识在某处可见,则就可以在该处引用此标识符。块作用域类作用域文件作用域作用域与可见性前一页休息6可见性标识符应声明在先,引用在后。在同一作用域中,不能声明同名的标识符。如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。作用域与可见性前一页休息7#includeiostream.hinti;//文件作用域intmain(){i=5;{inti;//块作用域i=7;couti=iendl;//输出7}couti=i;//输出5return0;}作用域与可见性例5.1前一页休息8对象的生存期对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。前一页休息9静态生存期这种生存期与程序的运行期相同。在文件作用域中声明的对象具有这种生存期。在函数内部声明静态生存期对象,要冠以关键字static。对象的生存期前一页休息10#includeiostream.hinti=5;//文件作用域intmain(){couti=iendl;return0;}i具有静态生存期对象的生存期例前一页休息11动态生存期块作用域中声明的对象是动态生存期的对象(习惯称局部生存期对象)。开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。对象的生存期前一页休息12#includeiostream.hvoidfun();voidmain(){fun();fun();}voidfun(){staticinta=1;inti=5;a++;i++;couti=i,a=aendl;}运行结果:i=6,a=2i=6,a=3i是动态生存期a是静态生存期对象的生存期例前一页休息13例5-2变量的生存期与可见性#includeiostream.hinti=1;//i为全局变量,具有静态生存期。voidmain(void){staticinta;//静态局部变量,有全局寿命,局部可见。intb=-10;//b,c为局部变量,具有动态生存期。intc=0;voidother(void);cout---MAIN---\n;couti:ia:ab:bc:cendl;c=c+8;other();cout---MAIN---\n;couti:ia:ab:bc:cendl;i=i+10;other();}对象的生存期voidother(void){staticinta=2;staticintb;//a,b为静态局部变量,具有全局寿命,局部可见。//只第一次进入函数时被初始化。intc=10;//C为局部变量,具有动态生存期,//每次进入函数时都初始化。a=a+2;i=i+32;c=c+5;cout---OTHER---\n;couti:ia:ab:bc:cendl;b=a;}运行结果:---MAIN---i:1a:0b:-10c:0---OTHER---i:33a:4b:0c:15---MAIN---i:33a:0b:-10c:8---OTHER---i:75a:6b:4c:15前一页休息16例5-3具有静态、动态生存期对象的时钟程序#includeiostream.hclassClock//时钟类声明{public://外部接口Clock();voidSetTime(intNewH,intNewM,intNewS);//三个形参均具有函数原型作用域voidShowTime();~Clock(){}private://私有数据成员intHour,Minute,Second;};对象的生存期//时钟类成员函数实现Clock::Clock()//构造函数{Hour=0;Minute=0;Second=0;}voidClock::SetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){coutHour:Minute:Secondendl;}ClockglobClock;//声明对象globClock,//具有静态生存期,文件作用域voidmain()//主函数{coutFirsttimeoutput:endl;//引用具有文件作用域的对象globClock:globClock.ShowTime();//对象的成员函数具有类作用域globClock.SetTime(8,30,30);ClockmyClock(globClock);//声明具有块作用域的对象myClockcoutSecondtimeoutput:endl;myClock.ShowTime();//引用具有块作用域的对象myClock}程序的运行结果为:Firsttimeoutput:0:0:0Firsttimeoutput:8:30:30前一页休息20数据与函数数据存储在局部对象中,通过参数传递实现共享——函数间的参数传递。数据存储在全局对象中。将数据和使用数据的函数封装在类中。例例前一页休息23静态成员静态数据成员–用关键字static声明–该类的所有对象维护该成员的同一个拷贝–必须在类外定义和初始化,用(::)来指明所属的类。静态成员函数–类外代码可以使用类名和作用域操作符来调用静态成员函数。–静态成员函数只能引用属于该类的静态数据成员或静态成员函数。静态成员前一页休息24例5-4具有静态数据成员的Point类#includeiostream.hclassPoint{public:Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}Point(Point&p);intGetX(){returnX;}intGetY(){returnY;}voidGetC(){coutObjectid=countPendl;}private:intX,Y;staticintcountP;};静态成员Point::Point(Point&p){X=p.X;Y=p.Y;countP++;}intPoint::countP=0;voidmain(){PointA(4,5);coutPointA,A.GetX(),A.GetY();A.GetC();PointB(A);coutPointB,B.GetX(),B.GetY();B.GetC();}#includeiostream.hclassApplication{public:staticvoidf();staticvoidg();private:staticintglobal;};intApplication::global=0;voidApplication::f(){global=5;}voidApplication::g(){coutglobalendl;}静态成员函数举例intmain(){Application::f();Application::g();return0;}静态成员函数举例classA{public:staticvoidf(Aa);private:intx;};voidA::f(Aa){coutx;//对x的引用是错误的couta.x;//正确}前一页休息28例5-5具有静态数据、函数成员的Point类#includeiostream.hclassPoint//Point类声明{public://外部接口Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}Point(Point&p);//拷贝构造函数intGetX(){returnX;}intGetY(){returnY;}staticvoidGetC(){coutObjectid=countPendl;}private://私有数据成员intX,Y;staticintcountP;}静态成员Point::Point(Point&p){X=p.X;Y=p.Y;countP++;}intPoint::countP=0;voidmain()//主函数实现{PointA(4,5);//声明对象AcoutPointA,A.GetX(),A.GetY();A.GetC();//输出对象号,对象名引用PointB(A);//声明对象BcoutPointB,B.GetX(),B.GetY();Point::GetC();//输出对象号,类名引用}前一页休息30友元友元是C++提供的一种破坏数据封装和数据隐藏的机制。通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。可以使用友元函数和友元类。为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。前一页休息31友元函数友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。访问对象中的成员必须通过对象名。友元前一页休息32例5-6使用友元函数计算两点距离#includeiostream.h#includemath.hclassPoint//Point类声明{public://外部接口Point(intxx=0,intyy=0){X=xx;Y=yy;}intGetX(){returnX;}intGetY(){returnY;}friendfloatfDist(Point&a,Point&b);private://私有数据成员intX,Y;};友元doubleDistance(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;}前一页休息34友元类若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。声明语法:将友元类名在另一个类中使用friend修饰说明。友元前一页休息35友元类举例classA{friendclassB;public:voidDisplay(){coutxendl;}private:intx;}classB{
本文标题:作用域―可见性―生存期
链接地址:https://www.777doc.com/doc-3691778 .html