《C++语言程序设计实验问题详解-大数据地共享与保护.docx》由会员分享,可在线阅读,更多相关《C++语言程序设计实验问题详解-大数据地共享与保护.docx(29页珍藏版)》请在优知文库上搜索。
1、实验05数据的共享与保护(2学时)(第5章数据的共享与保护)一、实验目的(1)观察程序运行中变量的作用域、生存期和可见性。(2)学习类的静态成员的使用。学习多文件结构在C+程序中的使用。二、实验任务5_1运行下面的程序,观察变量x、y的值。/Iab5_1.cpp#includeusingnamespacestd;voidfn1();intx=1,y=2;intmain()COUt”开始.endl;coutx=xendI;cout,y=,yendI;COUt“在main()中求X和y的值.endI;intx=10,y=20;cout,x=xendI;cout,y=,yendI;COUt“进入函数
2、fn1O.,endl;f111();cout返回main()endI;coutx=xendI;cout,y=,yendI;returnO;1voidfn1Ointy=200;cout,x=xendI;couty=,yd.exe开始.=1y=2在mainC中求X和y的值.=10y三20进入函数=1y=200返回InainC=10y=20请按任意键继续.2 .(编程)实现客户机(CLIENT)类。新建一个空的项目Iab5_2,添加头文件Client.h,在其中声明类CUENT,注意使用编译预处理命令;再添加源程序文件CIient.cpp,在其中实现CUENT类,注意静态成员变量的使用方法;再添加文
3、件Iab5_2.cpp,在其中定义main。函数,测试CUENT类,观察相应的成员变量取值的变化情况。提示:访问一台服务器的客户总数。符态成员为类的属性,为所有的类的对象共同拥有。再定义两个静态成员函数,分别显示服务器名和客户总数。构造函数用于增加一个客户,析构函数用于减少一个客户。定义一个对象,再定义第二个对象,然后减少一个对象。参考程序输出结果:第 0B1B2B1 继 键 茗数名数名数名数意 器总器总器总器总任 务户务户务户务户按 服嘉靠靠客请武C:fIHDOVSsysteB32cBd.exe程序及运行结果:(1)类声明头文件Client.h/cIient.h#ifndefCLIENT_H
4、#defineCLIENT_H其中的静态成员为类的属性,为所有的类的对象共同拥有classclient(pubIic:cIient();cIientO;staticvoidChangeServerName(charss);/改变服务器名称staticvoidShowServerName();staticvoidshowCIientNum();private:staticcharSerVerName;保存服务器名,引用性说明staticintClientNUm;/记录已定义的客户(即对象)数量,引用性说明);#endif(2)类实现程序文件CIient.cpp/cIient.cpp#includ
5、e#includeclient.husingnamespacestd;client::clientOClientNum+;/增加一个对象(客户)cIient:cIientOClientNum;/减少一个对象(客户)voidclient:ChangeServerName(charsn)ServerName=Sn;)/.staticvoidclient:ShowServerName()COUt服务器名:ServerNameendl;voidcIient:showCIientNum()CoUt客户总数:ClientNumendI;必须在文件作用域的某处用类名限定进行定义性说明,这时也可以进行初始化。
6、charclient::ServerName=A,;无StatiCintclient:CIientNm=O;(3)主函数文件Iab5_2.cpp/Iab52.cpp#include#include,cIient.husingnamespacestd;voidmain()(cIient::ShowServerName();/初始状态client:showCIientNum();/类名引用力争态成员函数cIient:ChangeServerName(,B);Clienta;/增加一个客户a. ShowServerName();/对象名引用静态成员函数a.showCIientNumO;(cIient
7、b;/增加一个客户b. ShowServerName();c. showCIientNum();)/减少一个客户cIient:ShowServerName();cIient::showCIientNum();1(4)运行结果附:第5章数据的共享与保护5.1 标识符的作用域与可见性P1465.1.1 作用域作用域是一个标识符在程序正文中有效的区域。C+的作用域有:函数原型作用域、块作用域(局部作用域)、类作用域、文件作用域。1 .函数原型作用域在函数原型声明时形式参数的作用范围。例,doubIeArea(doubIradius);其中标识符radius的作用(或称有效)篦国在形参列表的左、右括号
8、之间,称标识符radius的作用域是函数原型作用域。由于在函数原型的形参表中起作用的只是形参类型,标识符并不起作用,可省略。2 .局部作用域(块作用域)例:的作用域b的作用域的作用域voidfun(inta)intb=a;cinb;if(bO)intc;形参作用域:从形参列表中的声明处开始,到整个函数体结束处止。b和C都具有块作用域,是不同的块作用域。块是一对大括号括起来的一段程序。此例,函数体是一个块,汗语句后的分支体又是一个校小的块,二者是包含关系。在块中声明的标识符,其作用域从声明处开始,一直到块结束的大括号为止。具有块作用域的变量也称为局部变量。3 .美作用域类是一组有名成员的集合,类
9、X的成员In具有类作用域,对m的访问方式如下:(1)若在X的成员函数中无同名的局部作用域标识符,则在该函数内可访问成员01。(2)通过表达式xm或X:m。这正是程序中访问对象成员的最基本方法。(3)通过Prt-m这样的表达式,其中Prt为指向X类的一个对象的指针。4 .命名空间作用域命名空间大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名,将引发错误。命名空间可以解决类名、函数等的命名冲突。命名空间语法形式:namespace命名空间名命名空间内的各种声明(函数声明、类声明、)例namespaceSomeNscIassSomeCIass.;特殊的命名空间_全局命名空间:默认的命
10、名空间_匿名命名空间:对每个源文件是唯一的命名空间作用域一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符_命名空间名:标识符名例:声明一个SomeClaSS型的对象SomeNs:SomeCIassobj1;将其它命名空间作用域的标识符暴露于当前作用域_对指定标识符using命名空间名:标识符名;_对所有标识符USingnamespace命名空间名;例5T中所声明的全局变量就具有文件作用域,它们在整个文件中都有效。例5T作用域实例。#includeusingnamespacestd;/使得在当前文件中可直接引用Std命名空间的标识符COUtinti;全局变量,文件作用域nam
11、espaceNs(infj;/在NS命名空间中的全局变量)voidmain()(i=5;文件作用域的i赋初值Ns:尸6;为全局变量j赋值/子块1usingnamespaceNs;/使得在当前块中可直接引用Ns命名空间的标识符inti;局部变量,块作用域i=7;cout=iendl;/输出7coutj=jendl;)COUti=iendI;输出5参考(cout,endI是命名空间Std中的全局变量):#incIude/usingnamespacestd;/使得在当前文件中可直接引用Std命名空间的标识符cout,endIinti;全局变量,文件作用域namespaceNsintj;/在Ns命名空
12、间中的全局变量1voidmain()(i=5;文件作用域的i赋初值Ns:j=6;为全局变量j赋值/子块1usingnamespaceNs;/使得在当前块中可直接引用Ns命名空间的标识符inti;局部变量,块作用域=7;std:couti=,istd:endI;/输出7std:cout,j=jstd:endI;)std::couti=istd::endI;/输出5)具有文件作用域的变量也称为全局变量。5.1.2可见性可50可见的标识符程序运行到某一点,能够引用到的标识符。文件作用域最大,接下来依次是类作用域和块作用域。图5-1作用域关系图.文件作用域类作用域块作用域可见性表示从内层作用域向外层作用域“看”时能看到什么。作用域可见性的一般规则:_标识符声明在前,引用在后。_同一作用域,不能声明同名标识符。_在没有包含关系的不同作用域中声明的同名标识符互不影响。_在具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。例5-I中,文件作用域与块作用域相互包含。#incIudeusingnamespacestd;inti;全局变量,文件作用域namespaceNsintj;在NS命名空间中的全局变量J