C++语言程序设计试验答案_数据的共享与保护
. 实验实验 0505 数据的共享与保护(数据的共享与保护(2 2 学时)学时) (第 5 章 数据的共享与保护) 一、实验目的一、实验目的 (1)(1) 观察程序运行中变量的作用域、生存期和可见性。观察程序运行中变量的作用域、生存期和可见性。 (2)(2) 学习类的静态成员的使用。学习类的静态成员的使用。 (3)(3) 学习多文件结构在学习多文件结构在 C++C++程序中的使用。程序中的使用。 二、实验任务二、实验任务 5_15_1 运行下面的程序,观察变量运行下面的程序,观察变量 x x、、y y 的值。的值。 //lab5_1.cpp #include using namespace std; void fn1(); int x=1,y=2; int main(){ coutb; if(b0){ int c; b 的作用域 . c 的作用域 } } a 的作用域 形参作用域:从形参列表中的声明处开始,到整个函数体结束处止。形参作用域:从形参列表中的声明处开始,到整个函数体结束处止。 b b 和和 c c 都具有块作用域,是不同的块作用域。都具有块作用域,是不同的块作用域。 块是一对大括号括起来的一段程序。块是一对大括号括起来的一段程序。 此例,函数体是一个块,此例,函数体是一个块, if if 语句后的分支体又是一个较小的块,二者是包语句后的分支体又是一个较小的块,二者是包 含关系。含关系。 在块中声明的标识符,在块中声明的标识符, 其作用域从声明处开始,其作用域从声明处开始, 一直到块结束的大括号为止。一直到块结束的大括号为止。 具有块作用域的变量也称为具有块作用域的变量也称为局部变量局部变量。。 3. 3. 类作用域类作用域 类是一组有名成员的集合,类是一组有名成员的集合,类类 X X 的成员的成员 mm 具有类作用域,具有类作用域,对对 mm 的访问方式的访问方式 如下:如下: . . (1)(1) 若在若在 X X 的成员函数中无同名的局部作用域标识符,的成员函数中无同名的局部作用域标识符, 则在该函数可访问成则在该函数可访问成 员员 mm。。 (2)(2) 通过表达式通过表达式 x.mx.m 或或 X::mX::m。。这正是程序中访问对象成员的最基本方法。这正是程序中访问对象成员的最基本方法。 (3)(3) 通过通过 prt-mprt-m 这样的表达式,其中这样的表达式,其中 prtprt 为指向为指向 X X 类的一个对象的指针。类的一个对象的指针。 4. 4. 命名空间作用域命名空间作用域 命名空间命名空间 大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名,大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名, 将引发错误。将引发错误。 命名空间可以解决类名、函数等的命名冲突。命名空间可以解决类名、函数等的命名冲突。 命名空间语法形式:命名空间语法形式: namespacenamespace 命名空间名命名空间名{ { 命名空间的各种声明命名空间的各种声明( (函数声明、类声明、函数声明、类声明、…………) ) } } 例例 namespace SomeNs { class SomeClass { . }; } 特殊的命名空间特殊的命名空间 _ _ 全局命名空间全局命名空间:默认的命名空间:默认的命名空间 _ _ 匿名命名空间匿名命名空间:对每个源文件是唯一的:对每个源文件是唯一的 命名空间作用域命名空间作用域 一个命名空间确定了一个命名空间作用域一个命名空间确定了一个命名空间作用域 引用其它命名空间作用域中的标识符引用其它命名空间作用域中的标识符 _ _ 命名空间名命名空间名:: ::标识符名标识符名 _ _ 例:声明一个例:声明一个 SomeClassSomeClass 型的对象型的对象 SomeNs::SomeClass obj1;SomeNs::SomeClass obj1; 将其它命名空间作用域的标识符暴露于当前作用域将其它命名空间作用域的标识符暴露于当前作用域 _ _ 对指定标识符对指定标识符 usingusing 命名空间名命名空间名:: ::标识符名标识符名; ; _ _ 对所有标识符对所有标识符 using namespaceusing namespace 命名空间名命名空间名; ; 例例 5-15-1 中所声明的全局变量就具有文件作用域,它们在整个文件中都有中所声明的全局变量就具有文件作用域,它们在整个文件中都有 效。效。 例例 5-15-1 作用域实例。作用域实例。 #include using namespace std; //使得在当前文件中可直接引用 std 命名空间的标识符 cout int i;//全局变量,文件作用域 namespace Ns{ . . int j;//在 Ns 命名空间中的全局变量 } void main() { i=5;//文件作用域的 i 赋初值 Ns::j=6;//为全局变量 j 赋值 {//子块 1 using namespace Ns;//使得在当前块中可直接引用 Ns 命名空间的标识 符 int i;//局部变量,块作用域 i=7; cout。。 例例 5-55-5 具有静态数据和函数成员的具有静态数据和函数成员的 PointPoint 类。类。 图图 5-35-3 包含静态函数成员的包含静态函数成员的 PointPoint 类的类的 UMLUML 图图 Point . . – x : int – y : int – count : int=0 +Point(xx : int=0, yy : int=0) +getX() : int +getY() : int +Point(p : Point class Point{ public: Point(int xx=0,int yy=0):x(xx),y(yy){ count++; }; Point(Point y=p.y; count++; } ~Point(){ count--; } int getX(){ return x; } int getY(){ return y; } static void showCount(){ cout。。 例例 5-65-6 使用友元函数计算两点间的距离。使用友元函数计算两点间的距离。 图图 5-45-4 包含友元函数成员的包含友元函数成员的 PointPoint 类的类的 UMLUML 图图 Point – x : int – y : int +Point(xx : int=0, yy : int=0) +getX() : int +getY() : int 构造型依赖来表征。构造型依赖来表征。 图图 5-55-5 类类 A A 和类和类 B B 友元关系的友元关系的 UMLUML 图图 B 。。 例例 5-75-7 常成员函数举例。常成员函数举例。 图图 5-65-6 包含常成员函数的包含常成员函数的 R R 类的类的 UMLUML 图图 R – r1 : int – r2 : int +R(rr1 : int, rr2 : int) +print() : void ,按照标准方式搜索要嵌