C++语言程序设计(清华大学郑莉)五

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第五章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命名空间名;7作用域与可见性C++语言程序设计清华大学郑莉8可见性可见性是从对标识符的引用的角度来谈的概念可见性表示从内层作用域向外层作用域“看”时能看见什么。如果标识在某处可见,则就可以在该处引用此标识符。块作用域类作用域命名空间作用域作用域与可见性C++语言程序设计清华大学郑莉9可见性标识符应声明在先,引用在后。如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。作用域与可见性C++语言程序设计清华大学郑莉10同一作用域中的同名标识符在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名。重载的函数可以有相同的函数名。作用域与可见性C++语言程序设计清华大学郑莉11#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++语言程序设计清华大学郑莉12对象的生存期对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。C++语言程序设计清华大学郑莉13静态生存期这种生存期与程序的运行期相同。在文件作用域中声明的对象具有这种生存期。在函数内部声明静态生存期对象,要冠以关键字static。对象的生存期C++语言程序设计清华大学郑莉14#includeiostreamusingnamespacestd;inti=5;//文件作用域intmain(){couti=iendl;return0;}i具有静态生存期对象的生存期例C++语言程序设计清华大学郑莉15动态生存期块作用域中声明的,没有用static修是的对象是动态生存期的对象(习惯称局部生存期对象)。开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。对象的生存期C++语言程序设计清华大学郑莉16#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++语言程序设计清华大学郑莉17例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++语言程序设计清华大学郑莉20例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);//声明具有块作用域的对象myClockcoutSecondtimeoutput:endl;myClock.showTime();//引用具有块作用域的对象return0;}21程序的运行结果为:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:3022C++语言程序设计清华大学郑莉24数据与函数数据存储在局部对象中,通过参数传递实现共享——函数间的参数传递。数据存储在全局对象中。将数据和使用数据的函数封装在类中。数据与函数C++语言程序设计清华大学郑莉25使用全局对象#includeiostreamusingnamespacestd;intglobal;voidf(){global=5;}voidg(){coutglobalendl;}intmain(){f();g();//输出“5”return0;}数据与函数C++语言程序设计清华大学郑莉26将函数与数据封装#includeiostreamusingnamespacestd;classApplication{public:voidf();voidg();private:intglobal;};voidApplication::f(){global=5;}voidApplication::g(){coutglobalendl;}intmain(){ApplicationMyApp;MyApp.f();MyApp.g();return0;}数据与函数C++语言程序设计清华大学郑莉27静态成员静态数据成员–用关键字static声明–该类的所有对象维护该成员的同一个拷贝–必须在类外定义和初始化,用(::)来指明所属的类。静态成员函数–类外代码可以使用类名和作用域操作符来调用静态成员函数。–静态成员函数只能引用属于该类的静态数据成员或静态成员函数。静态成员C++语言程序设计清华大学郑莉28例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;};静态成员Point::Point(Point&p){x=p.x;x=p.y;count++;}intPoint::count=0;intmain(){Pointa(4,5);coutPointA:a.getX(),a.getY();a.showCount();Pointb(a);coutPointB:b.getX(),b.getY();b.showCount();return0;}28C++语言程序设计清华大学郑莉30静态成员函数举例#includeiostreamusingnamespacestd;classApplication{public:staticvoidf();staticvoidg();private:staticintglobal;};intApplication::global=0;voidApplication::f(){global=5;}voidApplication::g(){coutglobalendl;}intmain(){Application::f();Application::g();return0;}静态成员C++语言程序设计清华大学郑莉31静态成员函数举例classA{public:staticvoidf(Aa);private:intx;};voidA::f(Aa){cout

1 / 68
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功