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