1、第 五 章 C+程序的基本结构5-1 什么叫做作用域?有哪几种类型的作用域?解: 作用域讨论的是标识符的有效范围,作用域是一个标识符在程序正文中有效的区域。C+的作用域分为函数原形作用域、块作用域(局部作用域)、类作用域和文件作用域.5-2 什么叫做可见性?可见性的一般规则是什么?解: 可见性是标识符是否可以引用的问题;可见性的一般规则是:标识符要声明在前,引用在后,在同一作用域中,不能声明同名的标识符。对于在不同的作用域声明的标识符,遵循的原则是:若有两个或多个具有包含关系的作用域,外层声明的标识符如果在内层没有声明同名标识符时仍可见,如果内层声明了同名标识符则外层标识符不可见。 5-3 下
2、面的程序的运行结果是什么,实际运行一下,看看与你的设想有何不同。#include void myFunction(); int x = 5, y = 7; int main()cout x from main: x n;cout y from main: y nn;myFunction();cout Back from myFunction!nn;cout x from main: x n;cout y from main: y n;return 0;void myFunction()int y = 10;cout x from myFunction: x n;cout y from myFu
3、nction: y nn;解: 程序运行输出:x from main: 5y from main: 7x from myFunction: 5y from myFunction: 10Back from myFunction!x from main: 5y from main: 7 5-4 假设有两个无关系的类Engine和Fuel,使用时,怎样允许Fuel成员访问Engine中的私有和保护的成员?解: 源程序:class fuel;class enginefriend class fuel;private;int powerlevel;public;engine() powerLevel =
4、 0;void engine_fn(fuel &f);class fuelfriend class engine;private;int fuelLevel;public:fuel() fuelLevel = 0;void fuel_fn( engine &e); 5-5 什么叫做静态数据成员?它有何特点?解: 类的静态数据成员是类的数据成员的一种特例,采用static关键字来声明。对于类的普通数据成员,每一个类的对象都拥有一个拷贝,就是说每个对象的同名数据成员可以分别存储不同的数值,这也是保证对象拥有自身区别于其它对象的特征的需要,但是静态数据成员,每个类只要一个拷贝,由所有该类的对象共同维
5、护和使用,这个共同维护、使用也就实现了同一类的不同对象之间的数据共享。5-6 什么叫做静态函数成员?它有何特点?解: 使用static关键字声明的函数成员是静态的,静态函数成员属于整个类,同一个类的所有对象共同维护,为这些对象所共享。静态函数成员具有以下两个方面的好处,一是由于静态成员函数只能直接访问同一个类的静态数据成员,可以保证不会对该类的其余数据成员造成负面影响;二是同一个类只维护一个静态函数成员的拷贝,节约了系统的开销,提高程序的运行效率。5-7 定义一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;静态成员函数GetHowMany(),存取HowManyCa
6、ts。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。解: 源程序:#include class Catpublic:Cat(int age):itsAge(age)HowManyCats+; virtual Cat() HowManyCats-; virtual int GetAge() return itsAge; virtual void SetAge(int age) itsAge = age; static int GetHowMany() return HowManyCats; private:int itsAge;static int HowManyCats;int C
7、at:HowManyCats = 0;void TelepathicFunction();int main()const int MaxCats = 5;Cat *CatHouseMaxCats; int i;for (i = 0; iMaxCats; i+)CatHousei = new Cat(i);TelepathicFunction();for ( i = 0; iMaxCats; i+)delete CatHousei;TelepathicFunction();return 0;void TelepathicFunction()cout There are Cat:GetHowMan
8、y() cats alive!n;程序运行输出:There are 1 cats alive!There are 2 cats alive!There are 3 cats alive!There are 4 cats alive!There are 5 cats alive!There are 4 cats alive!There are 3 cats alive!There are 2 cats alive!There are 1 cats alive!There are 0 cats alive!5-8 什么叫做友元函数?什么叫做友元类?解: 友元函数是使用friend关键字声明的函数,
9、它可以访问相应类的保护成员和私有成员。友元类是使用friend关键字声明的类,它的所有成员函数都是相应类的友元函数。 5-9 如果类A是类B的友元,类B是类C的友元,类D是类A的派生类,那么类B是类A的友元吗?类C是类A的友元吗?类D是类B的友元吗?解: 类B不是类A的友元,友元关系不具有交换性;类C不是类A的友元,友元关系不具有传递性;类D不是类B的友元,友元关系不能被继承。5-10 静态成员变量可以为私有的吗?声明一个私有的静态整型成员变量。解: 可以,例如:private:static int a;5-11 在一个文件中定义一个全局变量n,主函数main(),在另一个文件中定义函数fn1
10、(),在main()中对n赋值,再调用fn1(),在fn1()中也对n赋值,显示n最后的值。解: #include #include fn1.hint n;void main()n = 20;fn1();cout n的值为 n;/ fn1.h文件 extern int n; void fn1()n=30;程序运行输出:n的值为305-12 在函数fn1()中定义一个静态变量n,fn1()中对n的值加1,在主函数中,调用fn1()十次,显示n的值。解: #include void fn1()static int n = 0;n+;cout n的值为 n endl;void main()for(i
11、nt i = 0; i i =+10; void Y:g(X* x) x-i +; class Z public:void f(X* x) x-i += 5; ;#endif / MY_X_Y_Z_H程序运行输出:无5-14 定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。解: 源程序:#include class Boat;class Carprivate:int weight;public:Car(int j)weight = j;friend int totalWeight(Car &aCar, Boat &aBo
12、at);class Boatprivate:int weight;public:Boat(int j)weight = j;friend int totalWeight(Car &aCar, Boat &aBoat);int totalWeight(Car &aCar, Boat &aBoat)return aCar.weight + aBoat.weight;void main()Car c1(4);Boat b1(5);cout totalWeight(c1, b1) endl;程序运行输出:95-15 如果在类模板的定义中有一个静态数据成员,则在程序运行中会产生多少个相应的静态变量?解: 这个类模板的每一个实例类都会产生一个相应的静态变量。