您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > c++语言程序设计(郑莉第四版)课件5
第五章C++程序的结构清华大学郑莉C++语言程序设计C++语言程序设计清华大学郑莉2本章主要内容作用域与可见性对象的生存期数据与函数静态成员共享数据的保护友元编译预处理命令多文件结构和工程深度探索C++语言程序设计清华大学郑莉3函数原形的作用域函数原型中的参数,其作用域始于(,结束于)。例如,设有下列原型声明:doublearea(doubleradius);radius的作用域仅在于此,不能用于程序正文其他地方,因而可有可无。作用域与可见性C++语言程序设计清华大学郑莉4局部作用域函数的形参,在块中声明的标识符,其作用域自声明处起,限于块中,例如:voidfun(inta){intb=a;cinb;if(b0){intc;......}}c的作用域b的作用域作用域与可见性a的作用域C++语言程序设计清华大学郑莉5类作用域类作用域作用于特定的成员名。类X的成员m具有类作用域,对m的访问方式如下:–如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员m。–通过表达式x.m或者X::m访问。–通过表达式ptr-M作用域与可见性C++语言程序设计清华大学郑莉6命名空间命名空间可以解决类名、函数名等的命名冲突命名空间的声明namespace命名空间名{各种声明(函数声明、类声明、……)}例namespaceSomeNs{classSomeClass{...};}特殊的命名空间–全局命名空间:默认的命名空间–匿名命名空间:对每个源文件是唯一的–具有命名空间作用域的变量也称为全局变量作用域与可见性C++语言程序设计清华大学郑莉命名空间作用域一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符–命名空间名::标识符名–例:声明一个SomeClass型的对象SomeNs::SomeClassobj1;将其它命名空间作用域的标识符暴露于当前作用域–对指定标识符using命名空间名::标识符名;–对所有标识符usingnamespace命名空间名;C++中标准程序库的所有标识符都被声明在std命名空间中Usingnamespacestd;Std::cin,std::cout,std::endl;7作用域与可见性C++语言程序设计清华大学郑莉命名空间作用域在包含多个源文件的工程中,把命名空间常常用来屏蔽不希望暴露给其他源文件的标识符,这是因为每个源文件的匿名命名空间是彼此不同的,在一个源文件中没有办法访问其他源文件的匿名命名空间。例5-18作用域与可见性C++语言程序设计清华大学郑莉9可见性可见性是从对标识符的引用的角度来谈的概念可见性表示从内层作用域向外层作用域“看”时能看见什么。如果标识在某处可见,则就可以在该处引用此标识符。块作用域类作用域命名空间作用域作用域与可见性C++语言程序设计清华大学郑莉10可见性标识符应声明在先,引用在后。如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。(同名隐藏原则)作用域与可见性C++语言程序设计清华大学郑莉11同一作用域中的同名标识符在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名。(同名隐藏原则)重载的函数可以有相同的函数名。作用域与可见性C++语言程序设计清华大学郑莉12#includeiostreamusingnamespacestd;inti;//在全局命名空间中的全局变量namespaceNs{intj;//在Ns命名空间中的全局变量}intmain(){i=5;//为全局变量i赋值Ns::j=6;//为全局变量j赋值{//子块1usingnamespaceNs;//当前块中可以直接引用Ns中的标识符inti;//局部变量,局部作用域i=7;couti=iendl;//输出7coutj=jendl;//输出6}couti=iendl;//输出5return0;}作用域与可见性例5.1C++语言程序设计清华大学郑莉13对象的生存期对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。C++语言程序设计清华大学郑莉14静态生存期这种生存期与程序的运行期相同。在命名空间作用域中声明的对象(例如全局变量)具有这种生存期。在函数内部声明静态生存期对象,要冠以关键字static。不随调用产生多次副本。可自动赋初值0。对象的生存期C++语言程序设计清华大学郑莉15#includeiostreamusingnamespacestd;inti=5;//命名空间作用域intmain(){couti=iendl;return0;}i具有静态生存期对象的生存期例C++语言程序设计清华大学郑莉16动态生存期块作用域中声明的,没有用static修饰的对象是动态生存期的对象(习惯称局部生存期对象)。开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。对象的生存期C++语言程序设计清华大学郑莉17#includeiostreamusingnamespacestd;voidfun();intmain(){fun();fun();}voidfun(){staticinta=1;inti=5;a++;i++;couti=i,a=aendl;}运行结果:i=6,a=2i=6,a=3i是动态生存期,每次进入函数时都初始化a是静态生存期,只第一次进入函数时被初始化对象的生存期例C++语言程序设计清华大学郑莉18例5-2变量的生存期与可见性#includeiostreamusingnamespacestd;inti=1;//i为全局变量,具有静态生存期。voidother(){staticinta=2;staticintb;//a,b为静态局部变量,具有全局寿命,局部可见。//只第一次进入函数时被初始化。intc=10;//C为局部变量,具有动态生存期,//每次进入函数时都初始化。a+=2;i+=32;c+=5;cout---OTHER---\n;couti:ia:ab:bc:cendl;b=a;}对象的生存期intmain(){staticinta;//静态局部变量,有全局寿命,局部可见。intb=-10;//b,c为局部变量,具有动态生存期。intc=0;cout---MAIN---\n;couti:ia:ab:bc:cendl;c+=8;other();cout---MAIN---\n;couti:ia:ab:bc:cendl;i+=10;other();return0;}17运行结果:---MAIN---i:1a:0b:-10c:0---OTHER---i:33a:4b:0c:15---MAIN---i:33a:0b:-10c:8---OTHER---i:75a:6b:4c:1518C++语言程序设计清华大学郑莉21例5-3具有静态、动态生存期对象的时钟程序#includeiostreamusingnamespacestd;classClock{//时钟类定义public://外部接口Clock();voidsetTime(intnewH,intnewM,intnewS);//三个形参均具有函数原型作用域voidshowTime();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;}20ClockglobClock;//声明对象globClock,//具有静态生存期,文件作用域intmain(){//主函数coutFirsttimeoutput:endl;//引用具有文件作用域的对象:globClock.showTime();//对象的成员函数具有类作用域globClock.setTime(8,30,30);ClockmyClock(globClock);//声明具有块作用域的对象myClock//调用拷贝构造函数,以globClock为初始值coutSecondtimeoutput:endl;myClock.showTime();//引用具有块作用域的对象return0;}21程序的运行结果为:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:3022C++语言程序设计清华大学郑莉25数据与函数数据存储在局部对象中,通过参数传递实现共享——函数间的参数传递。数据存储在全局对象中。将数据和使用数据的函数封装在类中。数据与函数C++语言程序设计清华大学郑莉26使用全局对象#includeiostreamusingnamespacestd;intglobal;voidf(){global=5;}voidg(){coutglobalendl;}intmain(){f();g();//输出“5”return0;}数据与函数C++语言程序设计清华大学郑莉27将函数与数据封装#includeiostreamusingnamespacestd;classApplication{public:voidf();voidg();private:intglobal;};voidApplication::f(){global=5;}voidApplication::g(){coutglobalendl;}intmain(){ApplicationMyApp;MyApp.f();MyApp.g();return0;}数据与函数C++语言程序设计清华大学郑莉28静态成员解决同一类的不同对象之间的数据和函数共享问题静态数据成员–用关键字static声明–该类的所有对象维护该成员的同一个拷贝–必须在类外定义和初始化,用(::)来指明所属的类。–类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。–静态数据成员具有静态生存期。–UML中用下划线来表示。静态成员C++语言程序设计清华大学郑莉29例5-4具有静态数据成员的Point类#includeiostreamusingnamespacestd;classPoint{public:Point(intx=0,inty=0):x(x),y(y){count++;}Point(Point&p);intgetX(){returnx;}intgetY(){returny;}voidshowCount(){coutObjectcount=“countendl;}private:intx,y;staticintcount;//所有对象共同维护同一个count};静态成员Point::Point(Point&p){x=p.x;x=p.y;count++;//在拷贝构造函数中对count累加,}intPoint::count=0;intmain(){Pointa(4,5);coutPointA:a.getX(),a.getY();a.showCount();Pointb(a);coutPointB:b.getX(),b.getY();b.showCount();retu
本文标题:c++语言程序设计(郑莉第四版)课件5
链接地址:https://www.777doc.com/doc-4803708 .html