您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++入门第五章数据的共享与保护
-1-17:43第五章—数据的共享与保护-2-17:432本章主要内容作用域与可见性对象的生存期类的静态成员友元共享数据的保护多文件结构与编译预处理命令-3-17:43作用域Share_Protect.cpp(12):errorC2065:‘a':undeclaredidentifierWHY?#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){inti=10;while(i0){inta=i+2;couta;}couta;return0;}-4-17:43作用域作用域:标识符的有效范围C++的几种常见作用域函数原型作用域局部作用域类作用域名字空间作用域(全局作用域)4-5-17:43函数原型的作用域函数原型中的参数,其作用域始于(,结束于)。例如,设有下列原型声明:doublevolume(doubleradius);doubleArea(doubleradius);radius的作用域仅在于此,不能用于程序正文其它地方,因而可有可无。-6-17:43局部作用域在函数中声明的变量(对象),具有局部作用域函数形参:从声明之处起,至函数体结束止,有效函数体内声明的对象(变量),从声明之处起,至声明所在的块结束的大括号止局部变量:具有局部作用域的变量6-7-17:43局部作用域在块中声明的标识符,其作用域自声明处起,限于本块中,例如:voidfun(inta){intb(a);cinb;if(b0){intc;......}……}c的作用域b的作用域a的作用域-8-17:43标准c++中:for(inti;i10;i++){……}……vc6.0中:for(inti;i10;i++){……}……8特别说明:VC6中,循环变量从定义之处起,在本函数内均有效i的作用域i的作用域-9-17:43类作用域类作用域:类定义内部和其所有成员函数的定义体。类的成员函数M具有类作用域,对M的访问方式如下:如果在类的任意成员函数中,没有声明与M同名的局部作用域标识符,那么在该函数内可以直接访问成员M。类外的函数、类1)x.M//通过对象x访问M(仅当M是public)2)X::M//通过类名访问M(仅当M是静态成员)通过表达式prt-M//通过指针(见第6章)-10-17:4310命名空间作用域命名空间:用于解决名字(标识符)的同名冲突命名空间的定义:namespacename{函数声明;变量声明;类声明;…………};命名空间作用域:在命名空间中,凡是不属于该命名空间下函数原型、函数体、类中声明的标识符,均属于命名空间作用域命名空间作用域的标识符,在本命名空间中任何地方均可使用-11-17:43不同命名空间中标识符的引用(法一)命名空间名::标识符名11-12-17:43法二:using命名空间名::标识符名作用:将指定空间中的指定标识符暴露在当前作用域中,可直接引用12#includeiostreamusingnamespacestd;namespacefirst{intx=5;inty=10;}namespacesecond{doublex=3.1416;doubley=2.7183;}intmain(){usingfirst::x;usingsecond::y;coutxendl;coutyendl;coutfirst::yendl;coutsecond::xendl;return0;}usingfirst::x;usingsecond::y;-13-17:43法三usingnamespace命名空间名;作用:将指定命名空间的所有标识符暴露在当前作用域中13#includeiostreamusingnamespacestd;namespacefirst{intx=5;inty=10;}namespacesecond{doublex=3.1416;doubley=2.7183;}intmain(){usingnamespacefirst;//将first空间的标识符全部暴露,可直接引用coutxendl;coutyendl;coutsecond::xendl;coutsecond::yendl;return0;}-14-17:43命名空间也可嵌套特殊的命名空间:全局命名空间(默认、缺省)1)前面所写的程序中,所有的函数等均属于全局命名空间2)若在任意函数的外面声明的变量,则该变量属于全局命名空间,具有全局命名空间作用域====》全局变量匿名命名空间1)用于隐藏不想暴露给别的文件的标识符14-15-17:4315#includeiostreamusingnamespacestd;inti;//在全局命名空间中的全局变量namespaceNs{intj;//在Ns命名空间中的全局变量}intmain(){Ns::j=6;//为全局变量j赋值intx=10;//局部变量couti=iendl;//输出0coutj=NS::jendl;//输出6cout“x=xendl;//输出10i=5;couti=iendl;return0;}-16-17:43关于全局数据的结论:全局数据包括:全局变量、全局常量、全局对象(在命名空间中定义的对象)当大多数函数都要访问某个数据时,可以将之定义为全局变量,免于参数传递缺点:破坏了模块的独立性全局数据在定义时时如没有初始化,则自动置为0(全局对象则自动调用默认构造函数初始化)16-17-17:4317可见性可见性:决定了标识符是否能被引用即使有效,但可能不能被引用如果标识在某处可见,则就可以在该处引用此标识符。-18-17:4318可见性原则:无包含关系的两作用域中声明的同名标识符,互不影响。相互包含的两个作用域,若内、外层中声明了同名标识符,则外层标识符在内层不可见。即:内层同名变量会屏蔽掉外层同名变量块作用域类作用域命名空间作用域-19-17:4319#includeiostreamusingnamespacestd;inti;//在全局命名空间中的全局变量intmain(){i=5;//为全局变量i赋值{//子块1inti;//局部变量i=7;cout“Locali=”iendl;//输出7cout“Globali=”::iendl;//输出5::i++;}cout“i=”iendl;//输出全局i:6return0;}//内层访问全局据变量的方法局部变量i的作用域-20-17:43对象的生存期生存期:对象从产生——〉销毁,即为它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。全局变量、常量、静态变量(全局、局部)动态分配的内存局部变量等代码区代码区全局数据区堆区栈区运行时,程序装载到内存后的分布默认初值为0-21-17:4321静态生存期静态生存期:与程序的运行期相同。具有命名空间作用域的变量(全局变量)在函数内部声明的静态局部变量静态局部变量:定义:在局部变量前加上static,即为静态局部变量存储位置:存放在全局数据区,默认初值为0特点:1)函数第一次调用时,建立静态变量2)该变量将一直存在,不会随函数调用返回而消失,静态变量的值会一直保持3)多次调用函数时,静态变量不会创建多个副本注意与普通变量的区别-22-17:4322动态生存期除全局变量、静态局部变量外的所有变量均为动态生存期的变量特点:从声明点之处起,结束于命名该标识符的作用域结束。-23-17:4323#includeiostreamusingnamespacestd;voidfun();intmain(){fun();fun();}voidfun(){staticinta=1;inti=5;a++;i++;couti=i,a=aendl;}运行结果:i=6,a=2i=6,a=3i是动态生存期a是静态生存期例-24-17:43例5-2变量的生存期与可见性#includeiostreamusingnamespacestd;inti=1;//i为全局变量,具有静态生存期。intmain(){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();}-25-17:43voidother(void){staticinta=2;//a,b为静态局部变量,具有全局寿命,局部可见。staticintb;//只第一次进入函数时被初始化,默认值为0。intc=10;//C为局部变量,具有动态生存期,每次进入函数时都初始化a=a+2;i=i+32;c=c+5;cout---OTHER---\n;couti:ia:ab:bc:cendl;b=a;}17-26-17:43运行结果:---MAIN---i:1a:0b:-10c:0---OTHER---i:33a:4b:0c:15---MAIN---i:33a:0b:-10c:8---OTHER---i:75a:6b:4c:1518-27-17:43思考:如何统计一个函数被调用的次数?如:SimpleCAI中如何统计做了多少次的练习?修改SimpleCAI,控制练习次数,如已经达到3次,则告知“练习结束,请注意休息!”27-28-17:43例5-3具有静态、动态生存期对象的时钟程序#includeiostreamusingnamespacestd;classClock//时钟类声明{public://外部接口Clock();voidSetTime(intNewH,intNewM,intNewS);//三个形参均具有函数原型作用域voidShowTime();~Clock(){}private://私有数据成员intHour,Minute,Second;};-29-17:43//时钟类成员函数实现Clock::Clock()//构造函数{Hour=0;Minute=0;Second=0;}voidClock::SetTime(intNewH,intNewM,intNewS{Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){coutHour:Minute:Secondendl;}-30-17:43ClockglobClock;//声明对象globClock,具有静态生存期,文件作用域intmain()//主函数{coutFirsttimeoutput:endl;//引用具有文件作用域的对象:globClock.ShowTime();//对象的成员函数具有类作用域globClock.SetTime(8,30,30);ClockmyClock(globClock);//声明具有块作用域的对象myClockcoutSecondtimeoutput:endl;myClock.ShowTime();//引用具有块作用域的对象}-31-17:43程序的运行结果为:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:3022-32-17:4332数据与函数的共享机制共享机制:数据存储在局部对象中,通
本文标题:C++入门第五章数据的共享与保护
链接地址:https://www.777doc.com/doc-2904200 .html