




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验05数据的共享与保护(2学时)(第5章数据的共享与保护)、实验目的(1)观察程序运行中变量的作用域、生存期和可见性。(2)学习类的静态成员的使用。(3)学习多文件结构在C+程序中的使用。二、实验任务5_1运行下面的程序,观察变量x、y的值。.endl;coutx= xendl;couty= yendl;cout在 main()中求 x 和 y 的值.endl;int x=10,y=20;coutx= xendl;couty= yendl;cout进入函数 fn1(). endl;fn1();cout返回 main() endl;coutx= xendl;couty= yendl;retur
2、n 0;void fn1()int y=200;coutx= xendl;couty= yn京客请程序及运行结果:(1)类声明头文件 showServerName();showClientNum();client b; showServerName();b. showClientNum();c: C: T I NI)0S sryst37 n d). azpfl u D 1 D 2 1 Is一二 % 4- f 1 I 名数名数名数名数意 弟总弟任器宝葬:0LI-任 务户多户多户多按 也殖r殖祜客行.1.1函数原型作用域在函数原型声明时形式参数的作用范围。例,double Area(double
3、radius);其中标识符radius的作用(或称有效)范围在形参列表的左、右括号之间,称标识符radius的作用域是函数原型作用域。由于在函数原型的形参表中起作用的只是形参类型,标识符并不起作用, 可省略。.局部作用域(块作用域)例:void fun(int a)、int b=a;:cinb;if(b0)int c; 11的作用域ja的作用域.七的作用域)JJ形参作用域:从形参列表中的声明处开始,到整个函数体结束处止 b和c都具有块作用域,是不同的块作用域。块是一对大括号括起来的一段程序。此例,函数体是一个块,if语句后的分支体又是一个较小的块,二者是包含关系。在块中声明的标识符,其作用域从
4、声明处开始,一直到块结束的大括号为 止。具有块作用域的变量也称为局部变量。.类作用域类是一组有名成员的集合,类 X的成员m具有类作用域,对m的访问方式 如下:(1)若在X的成员函数中无同名的局部作用域标识符,则在该函数内可访问成员m。(2)通过表达式或X:m。这正是程序中访问对象成员的最基本方法。(3)通过prt-m这样的表达式,其中prt为指向X类的一个对象的指针。.命名空间作用域命名空间大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名, 将引发错误。命名空间可以解决类名、函数等的命名冲突。命名空间语法形式:namespace命名空间名命名空间内的各种声明(函数声明、类声明、
5、)例namespace SomeNs classSomeClass .;特殊的命名空间_全局命名空间:默认的命名空间_匿名命名空间:对每个源文件是唯一的命名空间作用域一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符_命名空间名二标识符名_例:声明一个SomeClass型的对象SomeNs:SomeClass obj1;将其它命名空间作用域的标识符暴露于当前作用域_对指定标识符using命名空间名二标识符名;_对所有标识符using namespace命名空间名;例5-1中所声明的全局变量就具有文件作用域,它们在整个文件中都有效。例5-1作用域实例#include using
6、namespacestd;文件作用域美作用域块作用威5.1.21 521522若需要统计雇员总数,这个数据存放在什么地方呢若以类外的变量来存储总数,不能实现数据的隐藏。若在类中增加一个数据成员用以存放总数,必然在每一个对象中都存储一 个副本,不仅冗余,且每个对象分别维护一个“总数”,势必造成数据的不一致 性。比较理想的方案是类的所有对象共同拥有一个用于存放总数的数据成员。5.3.1静态数据成员 P154实例属性“一个类的所有对象具有相同的属性”,是指属性的个数、名称、数据类型 相同,各个对象的属性值则可各不相同。以类的非静态数据成员表示。类属性是描述类的所有对象的共同特征的一个数据项,对于任何
7、对象实例,它的 属性值是相同的。通过静态数据成员来实现“类属性”。静态数据成员的访问静态数据成员不属于任何一个对象,只能通过类名对它访问,用法是“ 类名二标识符”。静态数据成员的说明和定义在类的声明中仅仅对静态数据成员进行 引用性说明,必须在文件作用域的 某处用类名限定进行 定义性说明,这时也可进行初始化。在UML中,静态数据成员下方添加下划线。例5-4具有静态数据成员的Point类。引入静态数据成员的Point类。图5-2包含静态数据成员的Point类的UML图Pointx : inty : intcount : int=0+Point(xx :int=0, yy :int=0)+getX(
8、) :int+getY() :int+Point(p : Point&)+showCount() : void#include using namespacestd;classPoint(Point; a: 4,5 tcount=lPoint b: 4.5 前泉Press any Key to contirue_5.3.25.4.15.4.2.;声明友元类,是建立类与类之间的联系,实现类之间数据共享的一种途径。在UML中,两个类之间的友元关系是通过 构造型依赖来表征图5-5类A和类B友元关系的UML图BA-x : int+set(i : int) : void +display() :void
9、+display() :void+getx() : inta#include using namespace std;class Apublic:void display() coutxendl; int getx() return x; friend class B;private: int x;class Bpublic:void set(int i);void display() coutendl; private:A a;void B:set(int i):ess any hey to continue5.5.15.5.2常成员函数声明格式:类型说明符函数(参数表)const;汪忠:c
10、onst是函数类型的一个组成部分。常成员函数不能更新对象的数据成员,也不能调用该类中没有用 const 修饰的成员函数。 常对象只能调用它的常成员函数。const可用于对重载函数的区分。例如,void print();void print() const;这是对print的有效重载。在UML中,常成员函数前添加。例5-7常成员函数举例。图5-6包含常成员函数的R类的UML图R-ri : int-r2 : int+R(rr1 : int, rr2 : int)+print() : void+print() : void#include using namespace std;class Rpub
11、lic:R(int rr1,int rr2):r1(rr1),r2(rr2) void print();voidprint()const;常数据成员类的成员数据也可以是常量。使用const说明的数据成员为常数据成员。任何函数中都不能对常数据成员赋值。构造函数对常数据成员进行初始化,就只能通过初始化列表 在UML中,常数据成员前添加consto例5-8常数据成员举例。图5-7包含常数据成员的A类的UML图A-a : const int-b : const int=10+A(i : int)+print() : void#include using namespace std; class A p
12、ublic:A(int i);void print();private:const inta;类实现文件(*cpp文件)类的使用文件(*cpp,主函数文件)每个源程序文件称为一个编译单元。C+加法要求一个类的声明必须出现在所有使用该类的编译单元中惯用的做法将类的声明写在头文件中,使用该类的编译单元则包含这个头文件。例5-10具有静态数据、函数成员的 Point类,多文件组织。*E e w包Debiig*甄:归皿e-point麻45有索idlpint 浒康id-2-8文件,也可以是.cpp文件#include两上书写方式#include文件名,按照标准方式搜索要嵌入的文件,该文件位于C+S统目录
13、的include子目录下,一般包含系统提供的标准文件时采用这样的方式。#include”文件名”,首先在当前目录下搜索要嵌入的文件,若没有,再按照 标准方式搜索,对用户自己编写的文件一般采用这种方式。在使用多文件结构时,注意内联函数的特殊性一个内联函数,需要在每个调用它的编译单元中给出一个完全一致的实现。 惯用的做法是将内联函数的实现写在头文件中,由调用的编译单元包含这个头 文件。外部变量与外部函数P170用extern声明外部变量。外部变量是具有文件作用域的变量,定义在所有文件之外。声明一个外部变量时,可以同时定义它,也可以只是引用一个在别处声明 的外部变量。外部函数非成员函数具有文件作用域
14、,可以在不同的编译单元被调用,只要在调用 之前声明函数原型即可。可以在声明函数原型或定义函数时用 extern修饰,其效果与不加修饰的默 认状态是一样的。若在声明一个函数原型时或定义函数时冠以static修饰,就将函数的作用域限制在当前的编译单元内。标准 C+库 P172标准C+谈与组件在逻辑上分为6种类型:输入/输出类容器类与ADT (抽象数据类型)存储管理类算法错误处理运行环境支持对库中预定义内容的说明分别存在于不同的头文件中,要使用这些预定义 的成分,就要将相应的头文件包含到源程序中。标准C+航不再有“.h”扩展名,但仍保留18个带有“.h”扩展名的C头文 件。两种形式的头文件不能混用。
15、比如,若已经包含头文件iostream ,就不能再包含,而要代之以新的头文件cmath。使用标准C+针时,在紧接着所有的include指令之后,加入using namespacestd;将指定命名空间中的名称引入到当前命名空间中。否则,需要在使用std命名空间中的标识符时冠以命名空间名“二”。(第10 章)编译预处理P173编译器在对源程序进行编译之前,首先要由预处理程序对程序文本进行预 处理。预处理程序提供了一组编译预处理指令和预处理操作符。所有的预处理指令在程序中都是以“ #”来引导,每一条预处理指令单独占 用一行,不要用分号结束。预处理指令可以根据需要出现在程序中的任何位置。#inclu
16、de指令(文件包含指令)其作用是将另一个源文件嵌入到当前源文件中该点处。include文件名按标准方式搜索,文件位于 C+S统目录的include子目录下。include文件名首先在当前目录中搜索,若没有,再按标准方式控索。#define 和#口口6 指令#de巾ne用来定义符号常量, 例如,#define PI。#undef用来删除由#de巾ne定义的宏,使之不再起作用。3.条件编译指令用来限定程序中的某些内容要在满足一定条件的情况下才参与编译。常用的条件编译语句有下列5种形式:形式1#if常量表达式程序段1 2” .#elif常量表达式n程序段n defined操作符de巾ned是一个预处
17、理操作符,而不是指令,因此不要以#开头。defined (标识符)若“标识符”在此前经 #define定义过,且未经#undef删除,则上述表达 式为非0,否则为0。下面两种写法是完全等效的:#ifndef MYHEAD_H#define MYHEAD_H.#endif#if !define(MYHEAD_H)#define MYHEAD_H.#endif由于文件包含指令可以嵌套使用,在设计程序时要避免多次重复包含同一 个头文件,否则会引起变量及类的重复定义。基于上一章的例4-7。在类employee中增加一个静态数据成员 employeeNo来设置 本公司编号目前最大值,新增加的人员编号将在
18、创建对象的同时自动 在当前最大值基础上增加,从而减少了调用成员函数 IncreaseEmpNo(int steps)的麻烦。将empolyee类的声明部分和实现部分分成两个文件。例5-11人员信息管理程序整个程序分为三个文件:是类定义头文件是类实现文件是主函数文件图5-9小型公司的人员信息管理程序的 UML图employeeindividualEmpNo : int # grade :intaccumPay float# employeeNo :int=1000+ employee。+ employee()+ promote(: int) : void+ SetaccumPay( float)
19、 : void+ GetindividualEmpNo() :int + Getgrade() :int+ GetaccumPay() float类声明头文件:/class employeeprotected:int individualEmpNo”个人编号int grade;/ 级别float accumPay/ 月薪static int employeeNo;/本公司职员编号目前最大值 public:employee。;/构造函数-employee。/析构函数void promote(int);/升级void SetaccumPayfloat);/ 设置月薪 int Getindividu
20、alEmpNo()/提取编号 int Getgrade()/提取级另1J float GetaccumPay()/ 提取月薪;类实现程序文件:/#include #include using namespace std;int employee:employeeNo=1000员工编号基数,静态变量定义和初始化employee:employee()/新输入员工编号为目前最大编号加1,级别初值为1,月薪总额 individualEmpNo=employeeNo+; grade=1; accumPay; employee:employee()void employee二promote(int incre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川湖山电器股份有限公司招聘化专员等岗位79人笔试参考题库附带答案详解
- 2025内蒙古能源集团智慧运维公司社会招聘(105人)笔试参考题库附带答案详解
- 2025中国电信贵州公司校园招聘火热进行中笔试参考题库附带答案详解
- 应聘护工培训课件
- 达人课程设计方案
- 与校外人员交往安全
- 四年级语文考试复习计划
- 高校2025年国际交流合作计划
- 电力公司供货计划及应急措施
- 外研版九年级英语上学期分层教学计划
- 单休企业考勤管理制度
- 广东省深圳市福田区2023-2024学年七年级下学期期末生物学试题(解析版)
- 《Unit7Chinesefestivals》(教案)译林版英语五年级下册
- 合同到期不续约的通知模板
- 绿化养护服务投标方案(技术标)
- 小区物业服务投标方案(技术标)
- 电缆敷设及管内穿线施工方案
- 幼儿园成语故事《磨杵成针》课件
- 2024年郑州信息科技职业学院单招职业适应性测试题库学生专用
- 四季的问候合唱简谱
- 胃管置入术知情同意书
评论
0/150
提交评论