?
????? 第 五 章 ? ??C++程序的基本結(jié)構(gòu)
?
????? 5-1 什么叫做作用域?有哪幾種類型的作用域?
?
????? 解:
????? 作用域討論的是標識符的有效范圍,作用域是一個標識符在程序正文中有效的區(qū)域。C++的作用域分為函數(shù)原形作用域、塊作用域(局部作用域)、類作用域和文件作用域.
?
????? 5-2 什么叫做可見性?可見性的一般規(guī)則是什么?
?
????? 解:
????? 可見性是標識符是否可以引用的問題;
????? 可見性的一般規(guī)則是:標識符要聲明在前,引用在后,在同一作用域中,不能聲明同名的標識符。對于在不同的作用域聲明的標識符,遵循的原則是:若有兩個或多個具有包含關系的作用域,外層聲明的標識符如果在內(nèi)層沒有聲明同名標識符時仍可見,如果內(nèi)層聲明了同名標識符則外層標識符不可見。
?
?
????? 5-3 下面的程序的運行結(jié)果是什么,實際運行一下,看看與你的設想有何不同。
????? #include <iostream.h>
????? void myFunction();
????? int x = 5, y = 7;
????? int main()
????? {
????? cout << "x from main: " << x << " ";
????? cout << "y from main: " << y << " ";
????? myFunction();
????? cout << "Back from myFunction! ";
????? cout << "x from main: " << x << " ";
????? cout << "y from main: " << y << " ";
????? return 0;
????? }
????? void myFunction()
????? {
????? int y = 10;
????? cout << "x from myFunction: " << x << " ";
????? cout << "y from myFunction: " << y << " ";
????? }
?
????? 解:
????? 程序運行輸出:
????? x from main: 5
????? y from main: 7
????? x from myFunction: 5
????? y from myFunction: 10
????? Back from myFunction!
????? x from main: 5
????? y from main: 7
?
?
????? 5-4 假設有兩個無關系的類Engine和Fuel,使用時,怎樣允許Fuel成員訪問Engine中的私有和保護的成員?
?
?? ???解:
????? 源程序:
????? class fuel;
????? class engine
????? {
????? friend class fuel;
????? private;
????? int powerlevel;
????? public;
????? engine(){ powerLevel = 0;}
????? void engine_fn(fuel &f);
????? };
????? class fuel
????? {
????? friend class engine;
????? private;
????? int fuelLevel;
????? public:
????? fuel(){ fuelLevel = 0;}
????? void fuel_fn( engine &e);
????? };
????? 5-5 什么叫做靜態(tài)數(shù)據(jù)成員?它有何特點?
?
????? 解:
????? 類的靜態(tài)數(shù)據(jù)成員是類的數(shù)據(jù)成員的一種特例,采用static關鍵字來聲明。對于類的普通數(shù)據(jù)成員,每一個類的對象都擁有一個拷貝,就是說每個對象的同名數(shù)據(jù)成員可以分別存儲不同的數(shù)值,這也是保證對象擁有自身區(qū)別于其它對象的特征的需要,但是靜態(tài)數(shù)據(jù)成員,每個類只要一個拷貝,由所有該類的對象共同維護和使用,這個共同維護、使用也就實現(xiàn)了同一類的不同對象之間的數(shù)據(jù)共享。
?
????? 5-6 什么叫做靜態(tài)函數(shù)成員?它有何特點?
?
????? 解:
????? 使用static關鍵字聲明的函數(shù)成員是靜態(tài)的,靜態(tài)函數(shù)成員屬于整個類,同一個類的所有對象共同維護,為這些對象所共享。靜態(tài)函數(shù)成員具有以下兩個方面的好處,一是由于靜態(tài)成員函數(shù)只能直接訪問同一個類的靜態(tài)數(shù)據(jù)成員,可以保證不會對該類的其余數(shù)據(jù)成員造成負面影響;二是同一個類只維護一個靜態(tài)函數(shù)成員的拷貝,節(jié)約了系統(tǒng)的開銷,提高程序的運行效率。
?
????? 5-7
????? 定義一個Cat類,擁有靜態(tài)數(shù)據(jù)成員HowManyCats,記錄Cat的個體數(shù)目;靜態(tài)成員函數(shù)GetHowMany(),存取HowManyCats。設計程序測試這個類,體會靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)的用法。
?
????? 解:
????? 源程序:
????? #include <iostream.h>
????? class Cat
????? {
????? public:
????? 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 Cat::HowManyCats = 0;
????? void TelepathicFunction();
????? int main()
????? {
????? const int MaxCats = 5;
????? Cat *CatHouse[MaxCats]; int i;
????? for (i = 0; i<MaxCats; i++)
????? {
????? CatHouse[i] = new Cat(i);
????? TelepathicFunction();
????? }
????? for ( i = 0; i<MaxCats; i++)
????? {
????? delete CatHouse[i];
????? TelepathicFunction();
????? }
????? return 0;
????? }
????? void TelepathicFunction()
????? {
????? cout << "There are " << Cat::GetHowMany() << " cats alive! ";
????? }
????? 程序運行輸出:
????? 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 什么叫做友元函數(shù)?什么叫做友元類?
?
????? 解:
????? 友元函數(shù)是使用friend關鍵字聲明的函數(shù),它可以訪問相應類的保護成員和私有成員。友元類是使用friend關鍵字聲明的類,它的所有成員函數(shù)都是相應類的友元函數(shù)。
????? 5-9 如果類A是類B的友元,類B是類C的友元,類D是類A的派生類,那么類B是類A的友元嗎?類C是類A的友元嗎?類D是類B的友元嗎?
?
??? ??解:
????? 類B不是類A的友元,友元關系不具有交換性;
????? 類C不是類A的友元,友元關系不具有傳遞性;
????? 類D不是類B的友元,友元關系不能被繼承。
?
????? 5-10 靜態(tài)成員變量可以為私有的嗎?聲明一個私有的靜態(tài)整型成員變量。
?
????? 解:
????? 可以,例如:
????? private:
????? static int a;
?
????? 5-11
????? 在一個文件中定義一個全局變量n,主函數(shù)main(),在另一個文件中定義函數(shù)fn1(),在main()中對n賦值,再調(diào)用fn1(),在fn1()中也對n賦值,顯示n最后的值。
?
????? 解:
????? #include <iostream.h>
????? #include "fn1.h"
????? int n;
????? void main()
????? {
????? n = 20;
????? fn1();
????? cout << "n的值為" <<n;
????? }
????? // fn1.h文件
????? extern int n;
????? void fn1()
?? ???{
????? n=30;
????? }
????? 程序運行輸出:
????? n的值為30
?
????? 5-12 在函數(shù)fn1()中定義一個靜態(tài)變量n,fn1()中對n的值加1,在主函數(shù)中,調(diào)用fn1()十次,顯示n的值。
?
????? 解:
????? #include <iostream.h>
????? void fn1()
????? {
????? static int n = 0;
????? n++;
????? cout << "n的值為" << n <<endl;
???? ?}
????? void main()
????? {
????? for(int i = 0; i < 10; i++)
????? fn1();
????? }
????? 程序運行輸出:
????? n的值為1
????? n的值為2
????? n的值為3
????? n的值為4
????? n的值為5
????? n的值為6
????? n的值為7
????? n的值為8
????? n的值為9
????? n的值為10
?
????? 5-13
????? 定義類X、Y、Z,函數(shù)h(X*),滿足:類X有私有成員i,Y的成員函數(shù)g(X*)是X的友元函數(shù),實現(xiàn)對X的成員i加1,類Z是類X的友元類,其成員函數(shù)f(X*)實現(xiàn)對X的成員i加5,函數(shù)h(X*)是X的友元函數(shù),實現(xiàn)對X的成員i加10。在一個文件中定義和實現(xiàn)類,在另一個文件中實現(xiàn)main()函數(shù)。
?
????? 解:
????? #include "my_x_y_z.h"
????? void main()
????? {
????? X x;
????? Z z;
????? z.f(&x);
????? }
????? // my_x_y_z.h文件
????? #ifndef MY_X_Y_Z_H
????? class X;
????? class Y {
????? void g(X*);
????? };
????? class X
????? {
????? private:
????? int i;
????? public:
????? X(){i=0;}
????? friend void h(X*);
????? friend void Y::g(X*);
????? friend class Z;
????? };
??? ??void h(X* x) { x->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屬性,定義二者的一個友元函數(shù)totalWeight(),計算二者的重量和。
?
????? 解:
????? 源程序:
????? #include <iostream.h>
????? class Boat;
????? class Car
????? {
????? private:
????? int weight;
????? public:
????? Car(int j){weight = j;}
????? friend int totalWeight(Car &aCar, Boat &aBoat);
????? };
????? class Boat
????? {
? ????private:
????? 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;
????? }
????? 程序運行輸出:
????? 9
?
????? 5-15 如果在類模板的定義中有一個靜態(tài)數(shù)據(jù)成員,則在程序運行中會產(chǎn)生多少個相應的靜態(tài)變量?
?
????? 解:
????? 這個類模板的每一個實例類都會產(chǎn)生一個相應的靜態(tài)變量。
?