ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:157.86KB ,
资源ID:12108739      下载积分:8 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-12108739.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++语言程序设计实验答案数据的共享与保护资料.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、C+语言程序设计实验答案数据的共享与保护资料实验05 数据的共享与保护(2学时)(第5章 数据的共享与保护)一、实验目的(1) 观察程序运行中变量的作用域、生存期和可见性。(2) 学习类的静态成员的使用。(3) 学习多文件结构在C+程序中的使用。二、实验任务5_1 运行下面的程序,观察变量x、y的值。/lab5_1.cpp#include using namespace std;void fn1();int x=1,y=2;int main() cout开始.endl; coutx=xendl; couty=yendl; cout在main()中求x和y的值.endl; int x=10,y=

2、20; coutx=xendl; couty=yendl; cout进入函数fn1().endl; fn1(); cout返回main()endl; coutx=xendl; couty=yendl; return 0;void fn1() int y=200; coutx=xendl; couty=yendl;5_2 实现客户机(CLIENT)类。声明字符型静态数据成员ServerName,保存其服务器名称;声明整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。在头文件client.h中声明类,在文件client.cpp

3、中实现,在文件lab5_2.cpp中测试这个类,观察相应的成员变量取值的变化情况。三、实验步骤1.(验证)运行lab5_1.cpp程序,观察程序输出。全局变量的作用域为文件作用域,在整个程序运行期间有效,但如果在局部模块中声明了同名的变量,则在局部模块中,可见的是局部变量,此时,全局变量不可见;而局部变量的生存期只限于相应的程序模块中,离开相应的程序模块,局部变量x、y就不再存在,此时同名的全局变量重新可见。程序名:lab5_1.cpp。 程序的运行结果:2.(编程)实现客户机(CLIENT)类。新建一个空的项目lab5_2,添加头文件client.h,在其中声明类CLIENT,注意使用编译预

4、处理命令;再添加源程序文件client.cpp,在其中实现CLIENT类,注意静态成员变量的使用方法;再添加文件lab5_2.cpp,在其中定义main()函数,测试CLIENT类,观察 相应的成员变量取值的变化情况。提示:访问一台服务器的客户总数。静态成员为类的属性,为所有的类的对象共同拥有。再定义两个静态成员函数,分别显示服务器名和客户总数。构造函数用于增加一个客户,析构函数用于减少一个客户。定义一个对象,再定义第二个对象,然后减少一个对象。参考程序输出结果:程序及运行结果:(1) 类声明头文件client.h/client.h#ifndef CLIENT_H#define CLIENT_

5、H/其中的静态成员为类的属性,为所有的类的对象共同拥有class client public: client(); client(); static void ChangeServerName(char ss);/改变服务器名称 static void showServerName(); static void showClientNum(); private: static char ServerName;/保存服务器名,引用性说明 static int ClientNum;/记录已定义的客户(即对象)数量,引用性说明;#endif(2) 类实现程序文件client.cpp/client.c

6、pp#include #include client.husing namespace std;client:client() ClientNum+; /增加一个对象(客户)client:client() ClientNum-; /减少一个对象(客户)void client:ChangeServerName(char sn) ServerName=sn; /无staticvoid client:showServerName() cout服务器名:ServerNameendl; void client:showClientNum() cout客户总数: ClientNum endl; /必须在文

7、件作用域的某处用类名限定进行定义性说明,这时也可以进行初始化。char client:ServerName=A; /无staticint client:ClientNum=0;(3) 主函数文件lab5_2.cpp/lab5_2.cpp#include #include client.husing namespace std;void main() client:showServerName();/初始状态 client:showClientNum();/类名引用静态成员函数 client:ChangeServerName(B); client a;/增加一个客户 a. showServerN

8、ame();/对象名引用静态成员函数 a. showClientNum(); client b; /增加一个客户 b. showServerName(); b. showClientNum(); /减少一个客户 client:showServerName(); client:showClientNum();(4) 运行结果附:第5章 数据的共享与保护5.1 标识符的作用域与可见性P1465.1.1 作用域作用域是一个标识符在程序正文中有效的区域。C+的作用域有:函数原型作用域、块作用域(局部作用域)、类作用域、文件作用域。1. 函数原型作用域在函数原型声明时形式参数的作用范围。例, doubl

9、e Area(double radius);其中标识符radius的作用(或称有效)范围在形参列表的左、右括号之间,称标识符radius的作用域是函数原型作用域。由于在函数原型的形参表中起作用的只是形参类型,标识符并不起作用,可省略。2. 局部作用域(块作用域)例:形参作用域:从形参列表中的声明处开始,到整个函数体结束处止。b和c都具有块作用域,是不同的块作用域。块是一对大括号括起来的一段程序。此例,函数体是一个块,if语句后的分支体又是一个较小的块,二者是包含关系。在块中声明的标识符,其作用域从声明处开始,一直到块结束的大括号为止。具有块作用域的变量也称为局部变量。3. 类作用域类是一组有名

10、成员的集合,类X的成员m具有类作用域,对m的访问方式如下:(1) 若在X的成员函数中无同名的局部作用域标识符,则在该函数内可访问成员m。(2) 通过表达式x.m或X:m。这正是程序中访问对象成员的最基本方法。(3) 通过prt-m这样的表达式,其中prt为指向X类的一个对象的指针。4. 命名空间作用域命名空间大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名,将引发错误。命名空间可以解决类名、函数等的命名冲突。命名空间语法形式:namespace 命名空间名 命名空间内的各种声明(函数声明、类声明、)例namespace SomeNs class SomeClass . ;特殊的

11、命名空间_ 全局命名空间:默认的命名空间_ 匿名命名空间:对每个源文件是唯一的命名空间作用域一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符_ 命名空间名:标识符名_ 例:声明一个SomeClass型的对象SomeNs:SomeClass obj1;将其它命名空间作用域的标识符暴露于当前作用域_ 对指定标识符using 命名空间名:标识符名;_ 对所有标识符using namespace命名空间名;例5-1中所声明的全局变量就具有文件作用域,它们在整个文件中都有效。例5-1 作用域实例。#include using namespace std; /使得在当前文件中可直接引用

12、std命名空间的标识符coutint i;/全局变量,文件作用域namespace Ns int j;/在Ns命名空间中的全局变量void main() i=5;/文件作用域的i赋初值 Ns:j=6;/为全局变量j赋值 /子块1 using namespace Ns;/使得在当前块中可直接引用Ns命名空间的标识符 int i;/局部变量,块作用域 i=7; couti=iendl;/输出7 coutj=jendl; couti=iendl;/输出5参考(cout, endl是命名空间std中的全局变量):#include /using namespace std; /使得在当前文件中可直接引用

13、std命名空间的标识符cout,endlint i;/全局变量,文件作用域namespace Ns int j;/在Ns命名空间中的全局变量void main() i=5;/文件作用域的i赋初值 Ns:j=6;/为全局变量j赋值 /子块1 using namespace Ns;/使得在当前块中可直接引用Ns命名空间的标识符 int i;/局部变量,块作用域 i=7; std:couti=i std:endl;/输出7 std:coutj=j std:endl; std:couti=i std:endl;/输出5具有文件作用域的变量也称为全局变量。5.1.2 可见性P150可见的标识符 程序运行

14、到某一点,能够引用到的标识符。文件作用域最大,接下来依次是类作用域和块作用域。图5-1 作用域关系图可见性表示从内层作用域向外层作用域“看”时能看到什么。作用域可见性的一般规则:_ 标识符声明在前,引用在后。_ 同一作用域,不能声明同名标识符。_ 在没有包含关系的不同作用域中声明的同名标识符互不影响。_ 在具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。例5-l中,文件作用域与块作用域相互包含。#include using namespace std;int i;/全局变量,文件作用域namespace Nsint j;/在Ns命名空间中的全局变量void main() i=

15、5;/文件作用域的i赋初值 Ns:j=6;/为全局变量j赋值 /子块1 using namespace Ns; int i;/局部变量,块作用域 i=7; couti=iendl;/输出7 coutj=jendl; couti=iendl;/输出5在主函数内子块1前,可引用到具有文件作用域的变量,它是可见的。当进入子块1,只能引用到具有局部作用域的同名变量,文件作用域的同名变量不可见,称内层屏蔽,或同名覆盖,即内层的变量覆盖了外层的同名变量。5.2 对象的生存期P150对象(包括简单变量)从诞生到结束的这段时间就是它的生存期。5.2.1 静态生存期若对象的生存期与程序的运行期相同,称它具有静态

16、生存期。在文件作用域中声明的对象具有静态生存期的。若要在函数内部的块作用域中声明具有静态生存期的对象,则要使用关键字static。 static int i;i称为静态变量。其余的对象都具有动态生存期。定义时未指定初值的基本类型静态生存期变量,初值为0;动态生存期变量,不指定初值时值不确定。5.2.2 动态生存期在块作用域中声明的具有动态生存期的对象,称局部生存期对象。动态生存期对象诞生于声明点,结束于该标识符作用域结束处。例5-2 变量的生存期与可见性。局部变量就是具有块作用域的变量。全局变量就是具有文件作用域的变量。#include using namespace std;int i=1;

17、/i为全局变量,具有静态生存期void other(void) static int a=2; static int b;/a, b为静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化 int c=10;/c为局部变量,具有动态生存期,每次进入函数时都初始化 a=a+2; i=i+32; c=c+5; cout-OTHER-n; couti:i a:a b:b c:cendl; b=a;void main() static int a;/a为静态局部变量,具有全局寿命,局部可见 int b=-10;/b, c为局部变量,具有动态生存期 int c=0; cout-MAIN-n;

18、couti:i a:a b:b c:cendl; c=c+8; other(); cout-MAIN-n; couti:i a:a b:b c:cendl; c=c+10; other();例5-3 具有静态、动态生存期对象的时钟程序。声明具有函数原型作用域、块作用域、类作用域和文件作用域的多个变量及对象,并分析各自的可见性和生存期。#include using namespace std;class Clock/时钟类定义public: Clock(); void setTime(int newH,int newM,int newS);/三个形参具有函数原型作用域 void showTime

19、();private: int hour,minute,second;/时钟类成员函数实现Clock:Clock():hour(0),minute(0),second(0) /构造函数void Clock:setTime(int newH,int newM,int newS)/3个形参均具有局部作用域 hour=newH; minute=newM; second=newS; void Clock:showTime() couthour:minute:secondendl;Clock globClock;/声明对象,具有静态生存期,文件作用域void main() cout第一次输出:endl;

20、 /引用文件作用域的对象globClock: globClock.showTime();/对象的成员函数具有类作用域 globClock.setTime(8,30,30); Clock myClock(globClock);/声明具有块作用域的对象 cout第二次输出:endl; myClock.showTime();/引用具有块作用域的对象5.3 类的静态成员P153静态成员是解决同一个类的不同对象之间的数据和函数共享问题的。例,抽象出某公司全体雇员的共性,设计如下的雇员类:class Employee/雇员类private: int empNo; int id; string name;/

21、字符串对象 .若需要统计雇员总数,这个数据存放在什么地方呢?若以类外的变量来存储总数,不能实现数据的隐藏。若在类中增加一个数据成员用以存放总数,必然在每一个对象中都存储一个副本,不仅冗余,且每个对象分别维护一个“总数”,势必造成数据的不一致性。比较理想的方案是类的所有对象共同拥有一个用于存放总数的数据成员。5.3.1 静态数据成员P154实例属性“一个类的所有对象具有相同的属性”,是指属性的个数、名称、数据类型相同,各个对象的属性值则可各不相同。以类的非静态数据成员表示。类属性是描述类的所有对象的共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。通过静态数据成员来实现“类属性”。静态

22、数据成员的访问静态数据成员不属于任何一个对象,只能通过类名对它访问,用法是“类名:标识符”。静态数据成员的说明和定义在类的声明中仅仅对静态数据成员进行引用性说明,必须在文件作用域的某处用类名限定进行定义性说明,这时也可进行初始化。在UML中,静态数据成员下方添加下划线。例5-4 具有静态数据成员的Point类。引入静态数据成员的Point类。图5-2 包含静态数据成员的Point类的UML图Point x : int y : int count : int=0+Point(xx : int=0, yy : int=0)+getX() : int+getY() : int+Point(p : P

23、oint&)+showCount() : void#include using namespace std;class Point/Point类定义public: Point(int xx=0,int yy=0):x(xx),y(yy) count+; /所有对象共同维护count Point(Point &p) x=p.x; y=p.y; count+; Point() count-; int getX() return x; int getY() return y; void showCount() cout 对象count=countendl; /输出静态数据成员private: int

24、 x,y; static int count;/静态数据成员声明,用于记录点的个数;int Point:count=0;/静态数据成员定义和初始化,使用类名限定void main() Point a(4,5);/定义对象a,其构造函数会使count增1 coutPoint a: a.getX(),a.getY(); a.showCount();/输出对象个数 Point b(a); /定义对象b,其拷贝构造函数会使count增1 coutPoint b: b.getX(),b.getY(); b.showCount();在对类的静态私有数据成员初始化的同时,还可引用类的其他私有成员。例,若一个

25、类T存在类型T的静态私有对象,则可引用该类的私有构造函数将其初始化。5.3.2 静态函数成员P156静态成员函数是使用static关键字声明的函数成员。静态成员函数属于整个类,由同一个类的所有对象共同维护,并共享。对于公有的静态成员函数,可通过类名或对象名来调用。静态成员函数可直接访问该类的静态数据和函数成员,而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。class Apublic: static void f(A a);private: int x;void A:f(A a) coutx;/对x的引用是错误的。可用A:f(c)调用,此时,无当前对象。 couta

26、.x;/正确在UML中,静态函数成员前添加。例5-5 具有静态数据和函数成员的Point类。图5-3 包含静态函数成员的Point类的UML图Point x : int y : int count : int=0+Point(xx : int=0, yy : int=0)+getX() : int+getY() : int+Point(p : Point&)+showCount() : void#include using namespace std;class Pointpublic: Point(int xx=0,int yy=0):x(xx),y(yy) count+; ; Point(

27、Point &p) x=p.x; y=p.y; count+; Point() count-; int getX() return x; int getY() return y; static void showCount() cout 对象count=countendl; /静态函数成员private: int x,y; static int count;/静态数据成员声明;int Point:count=0;/静态数据成员定义及初始化,使用类名限定void main() Point a(4,5); coutPoint a: a.getX(),a.getY(); Point:showCount();/输出对象号,类名引用 Point b(a); coutPoint b: b.getX(),b.getY(); b.showCount();/输出对象号,对象名引用采用静态函数成员的好处可不依赖于任何对象,直接访问静态数据。5.4 类的友元P158友元提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。在一个类中,可用关键字friend将其他函数或类声明为友元。若友元是一般函数或类的成员函数,称友元函数;若友元是

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2