C语言学习知识程序设计实验规范标准答案数据的共享与保护.docx
- 文档编号:4463044
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:36
- 大小:139.59KB
C语言学习知识程序设计实验规范标准答案数据的共享与保护.docx
《C语言学习知识程序设计实验规范标准答案数据的共享与保护.docx》由会员分享,可在线阅读,更多相关《C语言学习知识程序设计实验规范标准答案数据的共享与保护.docx(36页珍藏版)》请在冰豆网上搜索。
C语言学习知识程序设计实验规范标准答案数据的共享与保护
实验05数据的共享与保护(2学时)
(第5章数据的共享与保护)
一、实验目的
(1)观察程序运行中变量的作用域、生存期和可见性。
(2)学习类的静态成员的使用。
(3)学习多文件结构在C++程序中的使用。
二、实验任务
5_1运行下面的程序,观察变量x、y的值。
//lab5_1.cpp
#include
usingnamespacestd;
voidfn1();
intx=1,y=2;
intmain(){
cout<<"开始..."< cout<<"x="< cout<<"y="< cout<<"在main()中求x和y的值..."< intx=10,y=20; cout<<"x="< cout<<"y="< cout<<"进入函数fn1()..."< fn1(); cout<<"返回main()"< cout<<"x="< cout<<"y="< return0; } voidfn1(){ inty=200; cout<<"x="< cout<<"y="< } 5_2实现客户机(CLIENT)类。 声明字符型静态数据成员ServerName,保存其服务器名称;声明整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。 在头文件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类,观察相应的成员变量取值的变化情况。 提示: 访问一台服务器的客户总数。 静态成员为类的属性,为所有的类的对象共同拥有。 再定义两个静态成员函数,分别显示服务器名和客户总数。 构造函数用于增加一个客户,析构函数用于减少一个客户。 定义一个对象,再定义第二个对象,然后减少一个对象。 参考程序输出结果: ★程序及运行结果: (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 #include #include"client.h" usingnamespacestd; client: : client(){ClientNum++;}//增加一个对象(客户) client: : ~client(){ClientNum--;}//减少一个对象(客户) voidclient: : ChangeServerName(charsn){ServerName=sn;}//无static voidclient: : showServerName(){cout<<"服务器名: "< voidclient: : showClientNum(){cout<<"客户总数: "< //必须在文件作用域的某处用类名限定进行定义性说明,这时也可以进行初始化。 charclient: : ServerName='A';//无static intclient: : ClientNum=0; (3)主函数文件lab5_2.cpp //lab5_2.cpp #include #include"client.h" usingnamespacestd; 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.1标识符的作用域与可见性P146 5.1.1作用域 作用域是一个标识符在程序正文中有效的区域。 C++的作用域有: 函数原型作用域、块作用域(局部作用域)、类作用域、文件作用域。 1.函数原型作用域 在函数原型声明时形式参数的作用范围。 例, doubleArea(doubleradius); 其中标识符radius的作用(或称有效)范围在形参列表的左、右括号之间,称标识符radius的作用域是函数原型作用域。 由于在函数原型的形参表中起作用的只是形参类型,标识符并不起作用,可省略。 2.局部作用域(块作用域) 例: voidfun(inta){ intb=a; cin>>b; if(b>0){ intc; ... } } a的作用域 c的作用域 b的作用域 形参作用域: 从形参列表中的声明处开始,到整个函数体结束处止。 b和c都具有块作用域,是不同的块作用域。 块是一对大括号括起来的一段程序。 此例,函数体是一个块,if语句后的分支体又是一个较小的块,二者是包含关系。 在块中声明的标识符,其作用域从声明处开始,一直到块结束的大括号为止。 具有块作用域的变量也称为局部变量。 3.类作用域 类是一组有名成员的集合,类X的成员m具有类作用域,对m的访问方式如下: (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作用域实例。 #include usingnamespacestd;//使得在当前文件中可直接引用std命名空间的标识符cout inti;//全局变量,文件作用域 namespaceNs{ intj;//在Ns命名空间中的全局变量 } voidmain() { i=5;//文件作用域的i赋初值 Ns: : j=6;//为全局变量j赋值 {//子块1 usingnamespaceNs;//使得在当前块中可直接引用Ns命名空间的标识符 inti;//局部变量,块作用域 i=7; cout<<"i="< cout<<"j="< } cout<<"i="< } 参考(cout,endl是命名空间std中的全局变量): #include //usingnamespacestd;//使得在当前文件中可直接引用std命名空间的标识符cout,endl inti;//全局变量,文件作用域 namespaceNs{ intj;//在Ns命名空间中的全局变量 } voidmain() { i=5;//文件作用域的i赋初值 Ns: : j=6;//为全局变量j赋值 {//子块1 usingnamespaceNs;//使得在当前块中可直接引用Ns命名空间的标识符 inti;//局部变量,块作用域 i=7; std: : cout<<"i="< : endl;//输出7 std: : cout<<"j="< : endl; } std: : cout<<"i="< : endl;//输出5 } 具有文件作用域的变量也称为全局变量。 5.1.2可见性P150 可见的标识符程序运行到某一点,能够引用到的标识符。 文件作用域最大,接下来依次是类作用域和块作用域。 图5-1作用域关系图 可见性表示从内层作用域向外层作用域“看”时能看到什么。 作用域可见性的一般规则: _标识符声明在前,引用在后。 _同一作用域,不能声明同名标识符。 _在没有包含关系的不同作用域中声明的同名标识符互不影响。 _在具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。 例5-l中,文件作用域与块作用域相互包含。 #include usingnamespacestd; inti;//全局变量,文件作用域 namespaceNs{ intj;//在Ns命名空间中的全局变量 } voidmain(){ i=5;//文件作用域的i赋初值 Ns: : j=6;//为全局变量j赋值 {//子块1 usingnamespaceNs; inti;//局部变量,块作用域 i=7; cout<<"i="< cout<<"j="< } cout<<"i="< } 在主函数内子块1前,可引用到具有文件作用域的变量,它是可见的。 当进入子块1,只能引用到具有局部作用域的同名变量,文件作用域的同名变量不可见,称内层屏蔽,或同名覆盖,即内层的变量覆盖了外层的同名变量。 5.2对象的生存期P150 对象(包括简单变量)从诞生到结束的这段时间就是它的生存期。 5.2.1静态生存期 若对象的生存期与程序的运行期相同,称它具有静态生存期。 在文件作用域中声明的对象具有静态生存期的。 若要在函数内部的块作用域中声明具有静态生存期的对象,则要使用关键字static。 staticinti; i称为静态变量。 其余的对象都具有动态生存期。 定义时未指定初值的基本类型静态生存期变量,初值为0;动态生存期变量,不指定初值时值不确定。 5.2.2动态生存期 在块作用域中声明的具有动态生存期的对象,称局部生存期对象。 动态生存期对象诞生于声明点,结束于该标识符作用域结束处。 例5-2变量的生存期与可见性。 局部变量就是具有块作用域的变量。 全局变量就是具有文件作用域的变量。 #include usingnamespacestd; inti=1;//i为全局变量,具有静态生存期 voidother(void){ staticinta=2; staticintb;//a,b为静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化 intc=10;//c为局部变量,具有动态生存期,每次进入函数时都初始化 a=a+2;i=i+32;c=c+5; cout<<"---OTHER---\n"; cout<<"i: "< "< "< "< b=a; } voidmain() { staticinta;//a为静态局部变量,具有全局寿命,局部可见 intb=-10;//b,c为局部变量,具有动态生存期 intc=0; cout<<"---MAIN---\n"; cout<<"i: "< "< "<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学习 知识 程序设计 实验 规范 标准答案 数据 共享 保护