C++语言程序设计实验答案_数据的共享与保护

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

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

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

资源描述

1实验05数据的共享与保护(2学时)(第5章数据的共享与保护)一、实验目的(1)观察程序运行中变量的作用域、生存期和可见性。(2)学习类的静态成员的使用。(3)学习多文件结构在C++程序中的使用。二、实验任务5_1运行下面的程序,观察变量x、y的值。//lab5_1.cpp#includeiostreamusingnamespacestd;voidfn1();intx=1,y=2;intmain(){cout开始...endl;coutx=xendl;couty=yendl;cout在main()中求x和y的值...endl;intx=10,y=20;coutx=xendl;couty=yendl;cout进入函数fn1()...endl;fn1();cout返回main()endl;coutx=xendl;couty=yendl;return0;}voidfn1(){inty=200;coutx=xendl;couty=yendl;}5_2实现客户机(CLIENT)类。声明字符型静态数据成员ServerName,保存其服务器名称;声明整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。2在头文件client.h中声明类,在文件client.cpp中实现,在文件lab5_2.cpp中测试这个类,观察相应的成员变量取值的变化情况。三、实验步骤1.(验证)运行lab5_1.cpp程序,观察程序输出。全局变量的作用域为文件作用域,在整个程序运行期间有效,但如果在局部模块中声明了同名的变量,则在局部模块中,可见的是局部变量,此时,全局变量不可见;而局部变量的生存期只限于相应的程序模块中,离开相应的程序模块,局部变量x、y就不再存在,此时同名的全局变量重新可见。程序名:lab5_1.cpp。★程序的运行结果:2.(编程)实现客户机(CLIENT)类。新建一个空的项目lab5_2,添加头文件client.h,在其中声明类CLIENT,注意使用编译预处理命令;再添加源程序文件client.cpp,在其中实现CLIENT类,注意静态成员变量的使用方法;再添加文件lab5_2.cpp,在其中定义main()函数,测试CLIENT类,观察相应的成员变量取值的变化情况。提示:访问一台服务器的客户总数。静态成员为类的属性,为所有的类的对象共同拥有。再定义两个静态成员函数,分别显示服务器名和客户总数。构造函数用于增加一个客户,析构函数用于减少一个客户。定义一个对象,再定义第二个对象,然后减少一个对象。参考程序输出结果:3★程序及运行结果:(1)类声明头文件client.h//client.h#ifndefCLIENT_H#defineCLIENT_H//其中的静态成员为类的属性,为所有的类的对象共同拥有classclient{public:client();~client();staticvoidChangeServerName(charss);//改变服务器名称staticvoidshowServerName();staticvoidshowClientNum();private:staticcharServerName;//保存服务器名,引用性说明staticintClientNum;//记录已定义的客户(即对象)数量,引用性说明};#endif(2)类实现程序文件client.cpp//client.cpp#includeiostream#includeclient.husingnamespacestd;client::client(){ClientNum++;}//增加一个对象(客户)client::~client(){ClientNum--;}//减少一个对象(客户)voidclient::ChangeServerName(charsn){ServerName=sn;}//无staticvoidclient::showServerName(){cout服务器名:ServerNameendl;}voidclient::showClientNum(){cout客户总数:ClientNumendl;}//必须在文件作用域的某处用类名限定进行定义性说明,这时也可以进行初始化。charclient::ServerName='A';//无staticintclient::ClientNum=0;(3)主函数文件lab5_2.cpp//lab5_2.cpp4#includeiostream#includeclient.husingnamespacestd;voidmain(){client::showServerName();//初始状态client::showClientNum();//类名引用静态成员函数client::ChangeServerName('B');clienta;//增加一个客户a.showServerName();//对象名引用静态成员函数a.showClientNum();{clientb;//增加一个客户b.showServerName();b.showClientNum();}//减少一个客户client::showServerName();client::showClientNum();}(4)运行结果5附:第5章数据的共享与保护5.1标识符的作用域与可见性P1465.1.1作用域作用域是一个标识符在程序正文中有效的区域。C++的作用域有:函数原型作用域、块作用域(局部作用域)、类作用域、文件作用域。1.函数原型作用域在函数原型声明时形式参数的作用范围。例,doubleArea(doubleradius);其中标识符radius的作用(或称有效)范围在形参列表的左、右括号之间,称标识符radius的作用域是函数原型作用域。由于在函数原型的形参表中起作用的只是形参类型,标识符并不起作用,可省略。2.局部作用域(块作用域)例:形参作用域:从形参列表中的声明处开始,到整个函数体结束处止。b和c都具有块作用域,是不同的块作用域。块是一对大括号括起来的一段程序。此例,函数体是一个块,if语句后的分支体又是一个较小的块,二者是包含关系。在块中声明的标识符,其作用域从声明处开始,一直到块结束的大括号为止。具有块作用域的变量也称为局部变量。3.类作用域类是一组有名成员的集合,类X的成员m具有类作用域,对m的访问方式如下:voidfun(inta){intb=a;cinb;if(b0){intc;...}}a的作用域c的作用域b的作用域6(1)若在X的成员函数中无同名的局部作用域标识符,则在该函数内可访问成员m。(2)通过表达式x.m或X::m。这正是程序中访问对象成员的最基本方法。(3)通过prt-m这样的表达式,其中prt为指向X类的一个对象的指针。4.命名空间作用域命名空间大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名,将引发错误。命名空间可以解决类名、函数等的命名冲突。命名空间语法形式:namespace命名空间名{命名空间内的各种声明(函数声明、类声明、……)}例namespaceSomeNs{classSomeClass{...};}特殊的命名空间_全局命名空间:默认的命名空间_匿名命名空间:对每个源文件是唯一的命名空间作用域一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符_命名空间名::标识符名_例:声明一个SomeClass型的对象SomeNs::SomeClassobj1;将其它命名空间作用域的标识符暴露于当前作用域_对指定标识符using命名空间名::标识符名;_对所有标识符usingnamespace命名空间名;例5-1中所声明的全局变量就具有文件作用域,它们在整个文件中都有效。例5-1作用域实例。#includeiostreamusingnamespacestd;//使得在当前文件中可直接引用std命名空间的标识符coutinti;//全局变量,文件作用域namespaceNs{intj;//在Ns命名空间中的全局变量}7voidmain(){i=5;//文件作用域的i赋初值Ns::j=6;//为全局变量j赋值{//子块1usingnamespaceNs;//使得在当前块中可直接引用Ns命名空间的标识符inti;//局部变量,块作用域i=7;couti=iendl;//输出7coutj=jendl;}couti=iendl;//输出5}参考(cout,endl是命名空间std中的全局变量):#includeiostream//usingnamespacestd;//使得在当前文件中可直接引用std命名空间的标识符cout,endlinti;//全局变量,文件作用域namespaceNs{intj;//在Ns命名空间中的全局变量}voidmain(){i=5;//文件作用域的i赋初值Ns::j=6;//为全局变量j赋值{//子块1usingnamespaceNs;//使得在当前块中可直接引用Ns命名空间的标识符inti;//局部变量,块作用域i=7;std::couti=istd::endl;//输出7std::coutj=jstd::endl;}std::couti=istd::endl;//输出5}具有文件作用域的变量也称为全局变量。85.1.2可见性P150可见的标识符程序运行到某一点,能够引用到的标识符。文件作用域最大,接下来依次是类作用域和块作用域。图5-1作用域关系图可见性表示从内层作用域向外层作用域“看”时能看到什么。作用域可见性的一般规则:_标识符声明在前,引用在后。_同一作用域,不能声明同名标识符。_在没有包含关系的不同作用域中声明的同名标识符互不影响。_在具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。例5-l中,文件作用域与块作用域相互包含。#includeiostreamusingnamespacestd;inti;//全局变量,文件作用域namespaceNs{intj;//在Ns命名空间中的全局变量}voidmain(){i=5;//文件作用域的i赋初值Ns::j=6;//为全局变量j赋值{//子块1usingnamespaceNs;inti;//局部变量,块作用域i=7;couti=iendl;//输出7coutj=jendl;}couti=iendl;//输出5}在主函数内子块1前,可引用到具有文件作用域的变量,它是可见的。当进入子块1,只能引用到具有局部作用域的同名变量,文件作用域的同名变量不可见,称内层屏蔽,或同名覆盖,即内层的变量覆盖了外层的同名变量。5.2对象的生存期P150对象(包括简单变量)从诞生到结束的这段时间就是它的生存期。95.2.1静态生存期若对象的生存期与程序的运行期相同,称它具有静态生存期。在文件作用域中声明的对象具有静态生存期的。若要在函数内部的块作用域中声明具有静态生存期的对象,则要使用关键字static。staticinti;i称为静态变量。其余的对象都具有动态生存期。定义时未指定初值的基本类型静态生存期变量,初值为0;动态生存期变量,不指定初值时值不确定。5.2.2动态生存期在块作用域中声明的具有动态生存期的对象,称局部生存期对象。动态生存期对象诞生于声明点,结束于该标识符作用域结束处。例5-2变量的生存期与可见性。局部变量就是具有块作用域的变量。全局变量就是具有文件作用域的变量。#includeiostreamusingnamespacestd;inti=1;//i为全局变量,具有静态生存期voidother(void){st

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

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

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

×
保存成功