1、C+语言程序设计实验答案数据的共享与保护实验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=x
2、endl; couty=yendl; return 0;void fn1() int y=200; coutx=xendl; couty=ym这样的表达式,其中prt为指向X类的一个对象的指针。4. 命名空间作用域命名空间大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名,将引发错误。命名空间可以解决类名、函数等的命名冲突。命名空间语法形式:namespace 命名空间名 命名空间内的各种声明(函数声明、类声明、)例namespace SomeNs class SomeClass . ;特殊的命名空间_ 全局命名空间:默认的命名空间_ 匿名命名空间:对每个源文件是唯一的命名空间作
3、用域一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符_ 命名空间名:标识符名_ 例:声明一个SomeClass型的对象SomeNs:SomeClass obj1;将其它命名空间作用域的标识符暴露于当前作用域_ 对指定标识符using 命名空间名:标识符名;_ 对所有标识符using namespace命名空间名;例5-1中所声明的全局变量就具有文件作用域,它们在整个文件中都有效。例5-1 作用域实例。#include using namespace std; 5.1.25.2.15.2.2.若需要统计雇员总数,这个数据存放在什么地方呢?若以类外的变量来存储总数,不能实现数据
4、的隐藏。若在类中增加一个数据成员用以存放总数,必然在每一个对象中都存储一个副本,不仅冗余,且每个对象分别维护一个“总数”,势必造成数据的不一致性。比较理想的方案是类的所有对象共同拥有一个用于存放总数的数据成员。5.3.1 静态数据成员P154实例属性“一个类的所有对象具有相同的属性”,是指属性的个数、名称、数据类型相同,各个对象的属性值则可各不相同。以类的非静态数据成员表示。类属性是描述类的所有对象的共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。通过静态数据成员来实现“类属性”。静态数据成员的访问静态数据成员不属于任何一个对象,只能通过类名对它访问,用法是“类名:标识符”。静态数
5、据成员的说明和定义在类的声明中仅仅对静态数据成员进行引用性说明,必须在文件作用域的某处用类名限定进行定义性说明,这时也可进行初始化。在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 : Point&)+showCount() : void#include using namespace
6、 std;class Point5.3.25.4.15.4.2. .;声明友元类,是建立类与类之间的联系,实现类之间数据共享的一种途径。在UML中,两个类之间的友元关系是通过构造型依赖来表征。图5-5 类A和类B友元关系的UML图#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
7、: A a;void B:set(int i) =i;5.5.15.5.2常成员函数声明格式:类型说明符 函数(参数表)const;注意: const是函数类型的一个组成部分。 常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。 常对象只能调用它的常成员函数。 const可用于对重载函数的区分。例如, void print(); void print() const;这是对print的有效重载。在UML中,常成员函数前添加。例5-7 常成员函数举例。图5-6 包含常成员函数的R类的UML图R r1 : int r2 : int+R(rr1 : int, rr2
8、: int)+print() : void+print() : void#include using namespace std;class Rpublic: R(int rr1,int rr2):r1(rr1),r2(rr2) void print(); void print() const;常数据成员类的成员数据也可以是常量。使用const说明的数据成员为常数据成员。任何函数中都不能对常数据成员赋值。构造函数对常数据成员进行初始化,就只能通过初始化列表。在UML中,常数据成员前添加const。例5-8 常数据成员举例。图5-7 包含常数据成员的A类的UML图A a : const int
9、b : const int=10+A(i : int)+print() : void#include using namespace std;class Apublic: A(int i); void print();private: const int a;5.5.35.6.1 C文件)类实现文件(*.cpp文件)类的使用文件(*.cpp,主函数文件)每个源程序文件称为一个编译单元。C+语法要求一个类的声明必须出现在所有使用该类的编译单元中。惯用的做法将类的声明写在头文件中,使用该类的编译单元则包含这个头文件。例5-10 具有静态数据、函数成员的Point类,多文件组织。-8 C文件,也可以
10、是.cpp文件。#include两上书写方式#include,按照标准方式搜索要嵌入的文件,该文件位于C+系统目录的include子目录下,一般包含系统提供的标准文件时采用这样的方式。#include文件名,首先在当前目录下搜索要嵌入的文件,若没有,再按照标准方式搜索,对用户自己编写的文件一般采用这种方式。在使用多文件结构时,注意内联函数的特殊性一个内联函数,需要在每个调用它的编译单元中给出一个完全一致的实现。惯用的做法是将内联函数的实现写在头文件中,由调用的编译单元包含这个头文件。5.6.2 外部变量与外部函数P170用extern声明外部变量。外部变量是具有文件作用域的变量,定义在所有文件之外。声明一个外部变量时,可以同时定义它,也可以只是引用一个在别处声明的外部变量。外部函数非成员函数具有文件作用域,可以在不同的编译单元被调用,只要在调用之前声明函数原型即可。可以在声明函数原型或定义函
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1