C++語言-南開大學(xué)第5章函數(shù)與運算符的重載b_第1頁
C++語言-南開大學(xué)第5章函數(shù)與運算符的重載b_第2頁
C++語言-南開大學(xué)第5章函數(shù)與運算符的重載b_第3頁
C++語言-南開大學(xué)第5章函數(shù)與運算符的重載b_第4頁
C++語言-南開大學(xué)第5章函數(shù)與運算符的重載b_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1第第5 5章章 函數(shù)與運算符的重載函數(shù)與運算符的重載5.1 5.1 .5.2 5.2 .5.3 5.3 函數(shù)的嵌套與遞歸函數(shù)的嵌套與遞歸5.4 5.4 函數(shù)與運算符的重載函數(shù)與運算符的重載5.5 5.5 函數(shù)與函數(shù)與C+C+程序結(jié)構(gòu)程序結(jié)構(gòu)5.6 5.6 程序?qū)嵗绦驅(qū)嵗?問題問題1 1,為什么要用函數(shù),為什么要用函數(shù)2 2,使用函數(shù)的程序和順序程序有什么,使用函數(shù)的程序和順序程序有什么區(qū)別?區(qū)別?35.3.15.3.1函數(shù)的嵌套函數(shù)的嵌套函數(shù)的嵌套函數(shù)的嵌套一個函數(shù)的函數(shù)體中包含一個或多個函數(shù)調(diào)用語句,即稱為函數(shù)嵌一個函數(shù)的函數(shù)體中包含一個或多個函數(shù)調(diào)用語句,即稱為函數(shù)嵌套套 。n嵌套的含

2、義是,如果函數(shù)A 要調(diào)用函數(shù)B,也就是說,函數(shù)A 的定義要依賴于函數(shù)B 的定義。因此函數(shù)B 的定義或函數(shù)B 的原型必須出現(xiàn)在函數(shù)A 的定義語句之前。n另一方面,函數(shù)A 調(diào)用函數(shù)B,在調(diào)用A 的過程中,即執(zhí)行A 的函數(shù)體過程中,調(diào)用B,也就是中途把程序控制轉(zhuǎn)到B 的函數(shù)體,在執(zhí)行結(jié)束后再返回到A 的函數(shù)體中。n函數(shù)嵌套調(diào)用所占用的空間(如賦值參數(shù)的創(chuàng)建等等)用堆棧(stack)的方式管理。一般這種堆棧所分配的空間是有限的,因此函數(shù)互相嵌套的層數(shù)也是有限的,依編譯系統(tǒng)不同,其允許的嵌套層數(shù)也可能不同。 4 函數(shù)調(diào)用的堆棧情況函數(shù)調(diào)用的堆棧情況堆棧堆棧Main()cuberoot( x ) 參數(shù)傳遞

3、、返回值參數(shù)傳遞、返回值保護(hù)現(xiàn)場、恢復(fù)現(xiàn)場保護(hù)現(xiàn)場、恢復(fù)現(xiàn)場調(diào)用調(diào)用返回返回5實例實例# include void f1 (int,int); void f2 (int); void main () int a, b ; cout a ; cout b; f1 (a, a+b); cout endl a+b endl; void f1 (int x, int y) int m = 2; x *= m ;y+; f2 (x+y)/m);void f2 (int p) if (p = 100) cout endl 1n1時,時, n!=nn!=n* *(n-1)!(n-1)!這正是我們編寫求這正是

4、我們編寫求n n的階乘的遞歸函數(shù)的階乘的遞歸函數(shù)prodprod的基礎(chǔ)。的基礎(chǔ)。10#include #include long long prod(intprod(int n) / n) /注意用的是注意用的是longlong,課本課本p131p131(3 3) if ( n=1 ) if ( n=1 ) return 1; /nreturn 1; /n等于等于1 1時,遞歸出口時,遞歸出口(“(“退出退出”遞歸遞歸) ) else elsereturn n return n * * prod(n-1)prod(n-1); ; / n/ n大于大于1 1時的返回值時的返回值( (n!)n!)

5、為為n n乘以乘以n-1n-1的階乘的階乘/ ( / ( 使用自遞歸調(diào)用使用自遞歸調(diào)用“prod(n-1)prod(n-1)”來求出來求出( (n-1)! )n-1)! )11void main( ) void main( ) intint n; n; coutcoutInput a positive integer:;n; n; / /輸入的正整數(shù)放入輸入的正整數(shù)放入n n中中 long p=prod(n); /long p=prod(n); /求出求出n n的階乘放入的階乘放入p p中中 coutcoutp=1p=1* *.* *n=pn=pendlendl; ; /輸出結(jié)果輸出結(jié)果p p

6、 12 上述求階乘的遞歸函數(shù)中,當(dāng)主函數(shù)通過上述求階乘的遞歸函數(shù)中,當(dāng)主函數(shù)通過prod(3)prod(3)對 遞 歸 函 數(shù)對 遞 歸 函 數(shù) p r o dp r o d 進(jìn) 行 調(diào) 用 時 , 它 的 返 回 值 為進(jìn) 行 調(diào) 用 時 , 它 的 返 回 值 為3 3* *prod(2)prod(2),此時系統(tǒng)將再一次對此時系統(tǒng)將再一次對prodprod本身進(jìn)行調(diào)用本身進(jìn)行調(diào)用而形成遞歸調(diào)用。而形成遞歸調(diào)用。 但注意后一次調(diào)用的實參為但注意后一次調(diào)用的實參為2 2,比上一次的實參,比上一次的實參3“3“下降下降”了了1 1。而計算。而計算prod(2)prod(2)時,它的返回值為時,它

7、的返回值為2 2* *prod(1)prod(1),此時系統(tǒng)將再一次對此時系統(tǒng)將再一次對prodprod本身進(jìn)行遞歸本身進(jìn)行遞歸調(diào)用,但此時的實參又調(diào)用,但此時的實參又“下降下降”了了1 1。13 正是通過這種實參的逐次正是通過這種實參的逐次“下降下降”,可保障遞,可保障遞歸函數(shù)在執(zhí)行若干次后歸函數(shù)在執(zhí)行若干次后( (此時的求階乘問題當(dāng)此時的求階乘問題當(dāng)“下下降降”到到1 1時時) ),能夠,能夠“退出退出”遞歸遞歸( (不再進(jìn)行遞歸調(diào)不再進(jìn)行遞歸調(diào)用,也即實現(xiàn)了遞歸出口用,也即實現(xiàn)了遞歸出口) )。 由于由于prod(1)prod(1)的返回的返回值為值為1 1,系統(tǒng)進(jìn)一步算出,系統(tǒng)進(jìn)一步算

8、出2 2* *prod(1)prod(1)的值(即的值(即prod(2)prod(2)的值)為的值)為2 2* *1=21=2,再進(jìn),再進(jìn)一步算出一步算出3 3* *prod(2)prod(2)的值為的值為3 3* *2=62=6,這正是,這正是prod(3)prod(3)的調(diào)用返回值的調(diào)用返回值( (也即求出了也即求出了3!=33!=3* *2 2* *1=6)1=6)。 14 雖然上述執(zhí)行過程是由系統(tǒng)自動完成的,但雖然上述執(zhí)行過程是由系統(tǒng)自動完成的,但程序員要理解并熟知這種調(diào)用機(jī)制與系統(tǒng)實現(xiàn)方程序員要理解并熟知這種調(diào)用機(jī)制與系統(tǒng)實現(xiàn)方法,從而才能編寫出邏輯正確且簡明易懂的遞歸法,從而才能編

9、寫出邏輯正確且簡明易懂的遞歸處理程序。處理程序。 另外注意,遞歸處理程序的執(zhí)行速度通常要另外注意,遞歸處理程序的執(zhí)行速度通常要比非遞歸處理方法慢。比非遞歸處理方法慢。問題:為什么會慢?問題:為什么會慢? 15 求出求出1 1到到n n之累加和的遞歸函數(shù)之累加和的遞歸函數(shù)sumsum 使程序執(zhí)行后的輸出結(jié)果為使程序執(zhí)行后的輸出結(jié)果為: :Input a positive integer:Input a positive integer:100100s=1+.+100=5050s=1+.+100=505016# #include include intint sum(intsum(int n) n

10、) /遞歸函數(shù)遞歸函數(shù)sumsum if ( n=1 ) if ( n=1 ) /n/n等于等于1 1時,遞歸出口時,遞歸出口return 1;return 1; else else return n + return n + sum(n-1)sum(n-1); ; /n/n大于大于1 1時的返回值時的返回值( (累加和累加和) )為為n n加上加上“從從1 1累加到累加到/n-1/n-1的和的和”(”(要使用要使用遞歸調(diào)用遞歸調(diào)用求出前求出前n-1n-1個數(shù)的累加和個數(shù)的累加和) )17 void main( ) void main( ) intint n; n; coutcoutInput

11、 a positive integer:;n; n; intint s=sum(n); / s=sum(n); /求出從求出從1 1累加到累加到n n的和放的和放s s中中 coutcouts=1+.+n=ss=1+.+n=sendlendl; ; 182 2 反序輸出從鍵盤輸入的反序輸出從鍵盤輸入的1010個整數(shù)個整數(shù) 反序輸出:從鍵盤輸入反序輸出:從鍵盤輸入10 10 個個intint 型數(shù),型數(shù),而后按輸入的相反順序輸出它們。而后按輸入的相反順序輸出它們。例如:例如:輸入:輸入:1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 輸出:輸出:10 9 8

12、7 6 5 4 3 2 110 9 8 7 6 5 4 3 2 119 2 2 反序輸出從鍵盤輸入的反序輸出從鍵盤輸入的1010個整數(shù)個整數(shù)# include void inv (int n) int i; cini;/輸入輸入if (n1) inv (n-1); /遞歸遞歸 else cout“- The result -”endl; /遞歸出口遞歸出口 cout i “ ”; /輸出輸出void main(void) coutInput 10 integers:endl;inv(10); coutendl; 20 2 2 反序輸出從鍵盤輸入的反序輸出從鍵盤輸入的1010個整數(shù)個整數(shù)n可以有

13、下面的執(zhí)行結(jié)果:可以有下面的執(zhí)行結(jié)果:nInput 10 integers:Input 10 integers:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 10- The result - The result -10 9 8 7 6 5 4 3 2 110 9 8 7 6 5 4 3 2 121 3 3 反序輸出一個整數(shù)反序輸出一個整數(shù) 在許多情形下遞歸函數(shù)易寫易讀,像解著名在許多情形下遞歸函數(shù)易寫易讀,像解著名的的Hanoi Hanoi 塔問題的遞歸函數(shù),其遞歸程序很塔問題的遞歸函數(shù),其遞歸程序很短,也極易理解短,也極易理解( (見見5.6 5.6 節(jié)節(jié))

14、),但是,如果不,但是,如果不用遞歸方法,程序?qū)⑹謴?fù)雜,很難編寫。用遞歸方法,程序?qū)⑹謴?fù)雜,很難編寫。要求要求 反序輸出一個正整數(shù)的各位數(shù)值,反序輸出一個正整數(shù)的各位數(shù)值, 如輸入如輸入231231,應(yīng)輸出,應(yīng)輸出132132。 22 3 3 反序輸出一個整數(shù)反序輸出一個整數(shù)# include int conv(int n) if (n10) coutn; return; /遞歸出口遞歸出口 cout n%10; conve(n/10); /遞歸遞歸 void main(void) int t;cout t; cout endl; conv(t);23 3 3 反序輸出一個整數(shù)反序輸出一個

15、整數(shù)輸出結(jié)果為:Input a positive number: 47811874如果不用遞歸函數(shù)設(shè)計,程序不如遞歸形式清晰: int conv(int n) if (n0) cout “Please input a positive number!”;else do cout n%10;n=/10; while (n!=0); 24 總結(jié)總結(jié)(1) (1) 無論是直接遞歸還是間接遞歸都必須保證在有無論是直接遞歸還是間接遞歸都必須保證在有限次調(diào)用之后能夠結(jié)束。例如函數(shù)限次調(diào)用之后能夠結(jié)束。例如函數(shù)facfac 中的參中的參數(shù)數(shù)n n 在遞歸調(diào)用中每次減在遞歸調(diào)用中每次減1 1,總可達(dá)到,總可達(dá)

16、到2 2 的狀的狀態(tài)而結(jié)束。態(tài)而結(jié)束。(2) (2) 函數(shù)調(diào)用時系統(tǒng)要付出時間和空間代價,在環(huán)函數(shù)調(diào)用時系統(tǒng)要付出時間和空間代價,在環(huán)境條件相同的情形下,總是非遞歸程序效率較境條件相同的情形下,總是非遞歸程序效率較高。高。 25 5.4 5.4 函數(shù)和運算符的重載函數(shù)和運算符的重載5.4.1 5.4.1 函數(shù)重載函數(shù)重載5.4.2 5.4.2 可重載運算符可重載運算符5.4.3 5.4.3 運算符重載函數(shù)的定義運算符重載函數(shù)的定義26 5.4.1 5.4.1 函數(shù)的重載函數(shù)的重載 函數(shù)重載實際上是函數(shù)名重載,即支持多個不同的函數(shù)采用同一函數(shù)重載實際上是函數(shù)名重載,即支持多個不同的函數(shù)采用同一名

17、字。名字。 例如:例如: intint abs abs(intint n n)returnreturn(n n0 0?-n-n:n n; float abs float abs(float ffloat f)ifif(f f0 0)f f-f-f; return freturn f; double abs double abs(double ddouble d)ifif(d d0 0)return-dreturn-d;return dreturn d; 三個函數(shù)都是求絕對值,采用同一個函數(shù)名,更符合人們的習(xí)慣三個函數(shù)都是求絕對值,采用同一個函數(shù)名,更符合人們的習(xí)慣 . .例如在程序中經(jīng)常出現(xiàn)這

18、樣的情況:對若干種不同的數(shù)據(jù)類型求例如在程序中經(jīng)常出現(xiàn)這樣的情況:對若干種不同的數(shù)據(jù)類型求和,雖然數(shù)據(jù)本身差別很大(例如整數(shù)求和,向量求和,矩陣和,雖然數(shù)據(jù)本身差別很大(例如整數(shù)求和,向量求和,矩陣求和),具體的求和操作差別也很大,但完成不同求和操作的求和),具體的求和操作差別也很大,但完成不同求和操作的函數(shù)卻可以取相同的名字(例如函數(shù)卻可以取相同的名字(例如sumsum,add add 等)。打印函數(shù)等)。打印函數(shù)printprint,顯示函數(shù),顯示函數(shù)displaydisplay等也是同樣。等也是同樣。 27 5.4.1 5.4.1 函數(shù)的重載函數(shù)的重載 函數(shù)名的重載并不是為了節(jié)省標(biāo)識符(

19、標(biāo)識函數(shù)名的重載并不是為了節(jié)省標(biāo)識符(標(biāo)識符的數(shù)量是足夠的),而是為了方便程序員符的數(shù)量是足夠的),而是為了方便程序員的使用,這一點很重要。實現(xiàn)函數(shù)的重載必的使用,這一點很重要。實現(xiàn)函數(shù)的重載必須滿足下列條件之一:須滿足下列條件之一:n(1 1)參數(shù)表中對應(yīng)的參數(shù)類型不同;)參數(shù)表中對應(yīng)的參數(shù)類型不同;n(2 2)參數(shù)表中參數(shù)個數(shù)不同;)參數(shù)表中參數(shù)個數(shù)不同;n(3 3)參數(shù)表中不同類型參數(shù)的次序不同。)參數(shù)表中不同類型參數(shù)的次序不同。28 5.4.1 5.4.1 函數(shù)的重載函數(shù)的重載例如:例如: void printvoid print(intint);); /整型整型 void print

20、 void print(pointpoint);); /類類point point 的對象的對象 intint sum sum(intint ,intint);); intint sum sum(intint ,intint ,intint);); intint get get(intint n n,float a float a );); intint get get(intint n n,float a float a ,intint n n);); 29 5.4.1 5.4.1 函數(shù)的重載函數(shù)的重載在定義同名函數(shù)時應(yīng)注意:在定義同名函數(shù)時應(yīng)注意:n(1 1)返回類型不能區(qū)分函數(shù),)返回類

21、型不能區(qū)分函數(shù), float addfloat add(intint float float);); intint add add(intint float float););/錯誤錯誤 n(2 2)采用引用參數(shù)不能區(qū)分函數(shù),)采用引用參數(shù)不能區(qū)分函數(shù),void printvoid print(doubledouble);); void printvoid print(doubledouble); /); /錯誤錯誤 n(3 3)有些派生基本類型的參數(shù)雖然可以區(qū)分同名函數(shù),)有些派生基本類型的參數(shù)雖然可以區(qū)分同名函數(shù),但在使用中必須注意但在使用中必須注意 n(4 4)包含可缺省參數(shù)時,可能造成

22、二義性,)包含可缺省參數(shù)時,可能造成二義性, 30 5.4.1 5.4.1 函數(shù)的重載函數(shù)的重載nC+C+對函數(shù)重載的處理過程:對函數(shù)重載的處理過程:(1 1)通過數(shù)組名與指針變量,函數(shù)名與函數(shù)指針,某類型變)通過數(shù)組名與指針變量,函數(shù)名與函數(shù)指針,某類型變量與量與const const 常量之間的轉(zhuǎn)換,再查是否可實現(xiàn)匹配;常量之間的轉(zhuǎn)換,再查是否可實現(xiàn)匹配;(2 2)把實參類型從低到高(按字長由短到長)進(jìn)行基本類型)把實參類型從低到高(按字長由短到長)進(jìn)行基本類型及其派生類型的轉(zhuǎn)換,再檢查是否可匹配;及其派生類型的轉(zhuǎn)換,再檢查是否可匹配; (3 3)查有無已定義的可變個數(shù)參數(shù)的函數(shù),如有把它

23、歸為該)查有無已定義的可變個數(shù)參數(shù)的函數(shù),如有把它歸為該函數(shù)。函數(shù)。在進(jìn)行上述嘗試性的處理之后可能出現(xiàn)仍無匹配或匹配不唯在進(jìn)行上述嘗試性的處理之后可能出現(xiàn)仍無匹配或匹配不唯一的情況,這時可能輸出出錯信息或錯誤地運行。一的情況,這時可能輸出出錯信息或錯誤地運行。 31 5.4.2 5.4.2 可重載運算符可重載運算符C+C+語言中的運算符實際上是函數(shù)的方便表示形式,語言中的運算符實際上是函數(shù)的方便表示形式,例如,算術(shù)運算符例如,算術(shù)運算符”+” +” 也可以表示為函數(shù)形式:也可以表示為函數(shù)形式:intint add ( add (intint a, a, intint b) return b)

24、return a+ba+b; ; 這時,這時,a+ba+b 和和 add (add (a,ba,b) ) 的含義是一樣的。的含義是一樣的。 C+C+語言規(guī)定,大多數(shù)運算符都可以重載,語言規(guī)定,大多數(shù)運算符都可以重載,單目運算符:單目運算符:- -, ,!,!,+,-,newnew,deletedelete雙目運算符:雙目運算符: + +,- -,* *, , , , =,!=!=, ,=- ,= = , , 等等 32 5.4.2 5.4.2 可重載運算符可重載運算符(1 1)可重載運算符幾乎包含了)可重載運算符幾乎包含了C+C+的全部運算符集,例外的是:限定的全部運算符集,例外的是:限定符符

25、. .,:,條件運算符?:,取長度運算符,:,條件運算符?:,取長度運算符sizeofsizeof 它們不可重載它們不可重載 (2 2)在可重載的運算符中有幾種不同情況:)在可重載的運算符中有幾種不同情況: 算術(shù)運算符,邏輯運算符,位運算符等與基本數(shù)據(jù)類型有關(guān),通過運算術(shù)運算符,邏輯運算符,位運算符等與基本數(shù)據(jù)類型有關(guān),通過運算苻重載函數(shù)的定義,使它們可以用于某些用戶定義的數(shù)據(jù)類型,算苻重載函數(shù)的定義,使它們可以用于某些用戶定義的數(shù)據(jù)類型,這是重載的主要目的。這是重載的主要目的。賦值運算符,關(guān)系運算符,!等所涉及的數(shù)據(jù)類型按賦值運算符,關(guān)系運算符,!等所涉及的數(shù)據(jù)類型按C+C+程序程序規(guī)定,并

26、非只限于基本數(shù)值類型。因此,這些運算符可以自動地擴(kuò)規(guī)定,并非只限于基本數(shù)值類型。因此,這些運算符可以自動地擴(kuò)展到任何用戶定義的數(shù)據(jù)類型,一般不需作重載定義就可展到任何用戶定義的數(shù)據(jù)類型,一般不需作重載定義就可“自動自動”地實現(xiàn)重載。地實現(xiàn)重載。 單目運算符單目運算符+和和-實際上各有兩種用法,前綴增(減)量和后綴增實際上各有兩種用法,前綴增(減)量和后綴增(減)量。其運算符重載函數(shù)的定義當(dāng)然是不同的,對兩種不同的(減)量。其運算符重載函數(shù)的定義當(dāng)然是不同的,對兩種不同的運算無法從重載函數(shù)的原型上予以區(qū)分:函數(shù)名(運算無法從重載函數(shù)的原型上予以區(qū)分:函數(shù)名(operator +operator

27、+)和參數(shù)表完全一樣。為了區(qū)別前綴和參數(shù)表完全一樣。為了區(qū)別前綴+和后綴和后綴+,C+C+語言規(guī)定,在語言規(guī)定,在后綴后綴+的重載函數(shù)的原型參數(shù)表中增加一個的重載函數(shù)的原型參數(shù)表中增加一個intint 型的無名參數(shù)。型的無名參數(shù)。 33 5.4.3 5.4.3 運算符重載函數(shù)的定義運算符重載函數(shù)的定義 運算符的重載是一個特殊函數(shù)定義過程,這類函運算符的重載是一個特殊函數(shù)定義過程,這類函數(shù)總是以數(shù)總是以operatoroperator 作為函數(shù)名。其實作為函數(shù)名。其實例在第七章以后引進(jìn)例在第七章以后引進(jìn) 假設(shè)程序中定義了一個枚舉類型的bool 類型: enum boolFALSE,TRUE; 用

28、運算符(雙目),*(雙目),(單目)來表示或、與、非運算是十分方便的:34 5.4.3 5.4.3 運算符重載函數(shù)的定義運算符重載函數(shù)的定義bool operator + (bool a ,bool b) if(aFALSE)()(bFALSE) return FALSE; return TRUE; bool operator*(bool a,bool b) if(aTRUE)()(bTRUE) return TRUE; return FALSE; bool operator-(bool a) if(aFALSE) return TRUE; return FALSE; 我們可以在程序中方便的表

29、我們可以在程序中方便的表示其運算:示其運算: b1b1b1+b2b1+b2; b1b1-b3-b3; b1b1(b1+b3b1+b3)* * FALSEFALSE;35 5.4.3 5.4.3 運算符重載函數(shù)的定義運算符重載函數(shù)的定義運算符重載函數(shù)的調(diào)用可有兩種方式:運算符重載函數(shù)的調(diào)用可有兩種方式:1 1 與原運算符相同的調(diào)用方式,如上例中的與原運算符相同的調(diào)用方式,如上例中的b1+b2b1+b2,b1b1* *b2b2,等等。,等等。2 2 一般函數(shù)調(diào)用方式,如一般函數(shù)調(diào)用方式,如b1+b2b1+b2,也可以寫為,也可以寫為operator+operator+(b1b1,b2b2)被重載的

30、運算符的調(diào)用方式,優(yōu)先級和運)被重載的運算符的調(diào)用方式,優(yōu)先級和運算順序都與原運算符一致,其運算分量的個數(shù)也不可算順序都與原運算符一致,其運算分量的個數(shù)也不可改變。改變。3 3 運算符重載主要用于用類的形式定義的用戶定義類型,運算符重載主要用于用類的形式定義的用戶定義類型,例如,復(fù)數(shù)類型,集合類型,向量類型等等,通過運例如,復(fù)數(shù)類型,集合類型,向量類型等等,通過運算符重載把人們習(xí)慣的運算符引入到計算操作之中,算符重載把人們習(xí)慣的運算符引入到計算操作之中,會收到很好的效果。這樣的實例將在第七章介紹。會收到很好的效果。這樣的實例將在第七章介紹。 36 5.5 5.5 函數(shù)與函數(shù)與C+C+程序結(jié)構(gòu)程

31、序結(jié)構(gòu)5.5.15.5.1庫函數(shù)的使用庫函數(shù)的使用 庫函數(shù)又稱標(biāo)準(zhǔn)函數(shù),是庫函數(shù)又稱標(biāo)準(zhǔn)函數(shù),是C+C+語言編譯系統(tǒng)為用語言編譯系統(tǒng)為用戶提供的內(nèi)部函數(shù),其編寫與一般用戶定義的戶提供的內(nèi)部函數(shù),其編寫與一般用戶定義的函數(shù)相同,程序員可在程序中直接使用,但是函數(shù)相同,程序員可在程序中直接使用,但是要在程序開頭說明庫函數(shù)所在的頭文件名,例要在程序開頭說明庫函數(shù)所在的頭文件名,例如:如: #include #include #include #include C+系統(tǒng)中有一個很大的標(biāo)準(zhǔn)函數(shù)庫(和標(biāo)準(zhǔn)類庫),包括許多在各種程序中常用的基本任務(wù)處理函數(shù),這些庫函數(shù)被分成不同的組,例如,數(shù)學(xué)計算、字符處理

32、、字符串處理、I/O操作、圖形處理等等, 37 5.5.2 SP5.5.2 SP框架結(jié)構(gòu)框架結(jié)構(gòu) 按結(jié)構(gòu)程序設(shè)計(按結(jié)構(gòu)程序設(shè)計(SPSP)思想設(shè)計的程序結(jié)構(gòu)稱為)思想設(shè)計的程序結(jié)構(gòu)稱為SPSP框框架。函數(shù)是架。函數(shù)是SPSP框架的核心??蚣艿暮诵?。 一個一個SPSP框架的完整框架的完整C+C+程序由下面幾部分組成:程序由下面幾部分組成:n1 1)一個主函數(shù)。它可調(diào)用其它函數(shù),但不能被調(diào)用。)一個主函數(shù)。它可調(diào)用其它函數(shù),但不能被調(diào)用。n2 2)任意多個用戶定義函數(shù)。都處于同一)任意多個用戶定義函數(shù)。都處于同一“等級等級”,可,可以互相調(diào)用。以互相調(diào)用。n3 3)全局說明。在所有函數(shù)定義之外的

33、變量說明和函數(shù))全局說明。在所有函數(shù)定義之外的變量說明和函數(shù)原型。原型。n4 4)預(yù)處理命令。在進(jìn)行預(yù)處理后,這部分被取代。)預(yù)處理命令。在進(jìn)行預(yù)處理后,這部分被取代。n5 5)注釋。只起方便閱讀的作用,編譯后被刪除。)注釋。只起方便閱讀的作用,編譯后被刪除。38 5.5.2 SP5.5.2 SP框架結(jié)構(gòu)框架結(jié)構(gòu) 對于比較大的程序,可以把它們劃分為幾個程序文件,對于比較大的程序,可以把它們劃分為幾個程序文件,這些程序模塊可能由一個或多個程序員編寫,最簡單這些程序模塊可能由一個或多個程序員編寫,最簡單而有效的劃分方法是:而有效的劃分方法是:n 根據(jù)主函數(shù)和各用戶定義的函數(shù)的功能及相互關(guān)根據(jù)主函數(shù)

34、和各用戶定義的函數(shù)的功能及相互關(guān)系,把它們劃分成若干個系,把它們劃分成若干個.CPP.CPP文件。文件。n 按與每個按與每個.CPP .CPP 程序文件中的函數(shù)有關(guān)的全局說明程序文件中的函數(shù)有關(guān)的全局說明組成一個或多個組成一個或多個.h.h(頭)文件。(頭)文件。n 程序中使用的庫函數(shù)組成的若干程序中使用的庫函數(shù)組成的若干.CPP .CPP 文件和對應(yīng)文件和對應(yīng)的的.h .h 文件。在預(yù)處理命令的幫助下,一個文件。在預(yù)處理命令的幫助下,一個C+C+程序被程序被劃分為若干劃分為若干.CPP.CPP和和.h.h程序文件。在包含命令的幫助下,程序文件。在包含命令的幫助下,這些文件形成了一個有機(jī)的整體

35、。這些文件形成了一個有機(jī)的整體。n在這樣的模塊結(jié)構(gòu)中,各個在這樣的模塊結(jié)構(gòu)中,各個.CPP.CPP文件是全部函數(shù)的劃文件是全部函數(shù)的劃分,它們組成了程序代碼的主體。分,它們組成了程序代碼的主體。39 5.5.5.3 5.3 函數(shù)間的數(shù)據(jù)傳遞函數(shù)間的數(shù)據(jù)傳遞 1. 1. 通過賦值參數(shù)和返回語句(單向)通過賦值參數(shù)和返回語句(單向) 2 2通過全局變量(雙向)通過全局變量(雙向) 3.3.通過指針類型參數(shù)和引用參數(shù)(雙向)通過指針類型參數(shù)和引用參數(shù)(雙向) 4.4.函數(shù)的數(shù)組類型參數(shù)(雙向)函數(shù)的數(shù)組類型參數(shù)(雙向)401 1 通過賦值參數(shù)通過賦值參數(shù)(“(“單向傳遞單向傳遞”方式方式) ) 傳值

36、方向只是:傳值方向只是:“上層上層” =“” =“下層下層”。也即,。也即,可從主調(diào)函數(shù)可從主調(diào)函數(shù)A A中通過賦值參數(shù)所對應(yīng)的實參將值中通過賦值參數(shù)所對應(yīng)的實參將值“傳入傳入”到被調(diào)函數(shù)到被調(diào)函數(shù)B B內(nèi)內(nèi)( (去使用去使用) ),但不可將被調(diào)函,但不可將被調(diào)函數(shù)數(shù)B B內(nèi)改變后的參數(shù)值內(nèi)改變后的參數(shù)值“傳出傳出”到主調(diào)函數(shù)到主調(diào)函數(shù)A A中中( (去接去接著使用著使用) )。系統(tǒng)處理方式為。系統(tǒng)處理方式為: : 被調(diào)函數(shù)中對形參值的被調(diào)函數(shù)中對形參值的改變不影響主調(diào)函數(shù)處的任一變量的值改變不影響主調(diào)函數(shù)處的任一變量的值( (形參分配有形參分配有自己的局部于被調(diào)函數(shù)的存儲空間,調(diào)用入口處將自

37、己的局部于被調(diào)函數(shù)的存儲空間,調(diào)用入口處將實參表達(dá)式的值賦給該局部變量實參表達(dá)式的值賦給該局部變量) )。 41 通過函數(shù)返回值通過函數(shù)返回值(“(“單向傳遞單向傳遞”方式方式) ) 通過函數(shù)內(nèi)使用的通過函數(shù)內(nèi)使用的returnreturn語句語句, , 可將被調(diào)函數(shù)可將被調(diào)函數(shù)B B內(nèi)計算出的最終值內(nèi)計算出的最終值“傳傳出出”到主調(diào)函數(shù)到主調(diào)函數(shù)A A的的“調(diào)用點調(diào)用點”處處( (去去接著使用接著使用) )。也即,傳值方向只是:。也即,傳值方向只是:“下層下層” =“” =“上層上層”。 42 全局變量的定義域可延續(xù)到整個程序執(zhí)行結(jié)束,因此,只全局變量的定義域可延續(xù)到整個程序執(zhí)行結(jié)束,因此,

38、只要在函數(shù)中沒有把該全局變量名說明為其它變量,在所有的要在函數(shù)中沒有把該全局變量名說明為其它變量,在所有的函數(shù)中都可以直接訪問它,也就是說,函數(shù)間的數(shù)據(jù)傳遞還函數(shù)中都可以直接訪問它,也就是說,函數(shù)間的數(shù)據(jù)傳遞還可以通過全局變量實現(xiàn),這種傳遞可以是雙向的可以通過全局變量實現(xiàn),這種傳遞可以是雙向的 可從主調(diào)函數(shù)可從主調(diào)函數(shù)A A中通過全局變量將值中通過全局變量將值“傳入傳入”到到被調(diào)函數(shù)被調(diào)函數(shù)B B內(nèi)內(nèi)( (在在A A中賦值中賦值, , 進(jìn)入進(jìn)入B B內(nèi)后使用該值內(nèi)后使用該值) ),又可將被調(diào)函數(shù)又可將被調(diào)函數(shù)B B內(nèi)改變后的全局變量值內(nèi)改變后的全局變量值“傳出傳出”到主調(diào)函數(shù)到主調(diào)函數(shù)A A中

39、中( (去接著使用去接著使用) )。也即,傳值方向可。也即,傳值方向可為:為:“上層上層” =“” =“下層下層”,“下層下層” =“” =“上層上層”。2 通過全局變量通過全局變量(“雙向傳遞雙向傳遞”方式方式)43 3 3 通過引用參數(shù)通過引用參數(shù)(“(“雙向傳遞雙向傳遞”方式,方式, 有關(guān)引用的其它使用方法詳見第有關(guān)引用的其它使用方法詳見第6 6章章) ) 傳值方向可為:傳值方向可為:“上層上層” =“” =“下層下層”,“下下層層” =“” =“上層上層”。即是說,它不僅可向被調(diào)函數(shù)。即是說,它不僅可向被調(diào)函數(shù)的形參的形參“傳入傳入”值值( (調(diào)用時的實參值調(diào)用時的實參值) ),而且還

40、可,而且還可通過該形參通過該形參“傳出傳出”值。系統(tǒng)處理方式為值。系統(tǒng)處理方式為: : 被調(diào)被調(diào)函數(shù)中對形參值的使用與改變,就是對主調(diào)函數(shù)函數(shù)中對形參值的使用與改變,就是對主調(diào)函數(shù)中調(diào)用語句處所對應(yīng)實參變量值的直接使用與改中調(diào)用語句處所對應(yīng)實參變量值的直接使用與改變變( (形參不具有自己的局部于被調(diào)函數(shù)的存儲空間,形參不具有自己的局部于被調(diào)函數(shù)的存儲空間,它只是實參變量的一個它只是實參變量的一個“替身替身”)”)。44 4 4 通過數(shù)組參數(shù)或指針參數(shù)通過數(shù)組參數(shù)或指針參數(shù)(“(“雙向傳遞雙向傳遞” 方式,指針參數(shù)的具體使用方法見第方式,指針參數(shù)的具體使用方法見第6 6章章) ) 傳值方向可為:

41、傳值方向可為:“上層上層” =“” =“下層下層”,“下層下層” =“” =“上層上層”。 數(shù)組作形參,且數(shù)組作形參,且在被調(diào)函數(shù)內(nèi)使用或改變在被調(diào)函數(shù)內(nèi)使用或改變數(shù)組元素數(shù)組元素的值的值。系統(tǒng)處理方式為。系統(tǒng)處理方式為: : 對形參數(shù)組對形參數(shù)組元素的使用與改變,就是對實參數(shù)組元素的直元素的使用與改變,就是對實參數(shù)組元素的直接使用與改變。接使用與改變。 指針作形參,且指針作形參,且在被調(diào)函數(shù)內(nèi)使用或改變在被調(diào)函數(shù)內(nèi)使用或改變指針?biāo)缸兞恐羔標(biāo)缸兞康闹档闹?。系統(tǒng)處理方式為。系統(tǒng)處理方式為: : 被調(diào)函被調(diào)函數(shù)中對形參指針?biāo)缸兞恐档氖褂门c改變,就數(shù)中對形參指針?biāo)缸兞恐档氖褂门c改變,就是對實

42、參指針?biāo)缸兞恐档闹苯邮褂门c改變。是對實參指針?biāo)缸兞恐档闹苯邮褂门c改變。45 數(shù)組可作為函數(shù)參數(shù),從而把主調(diào)函數(shù)數(shù)組可作為函數(shù)參數(shù),從而把主調(diào)函數(shù)中的整個數(shù)組中的整個數(shù)組( (實際上是數(shù)組的首地址實際上是數(shù)組的首地址) )傳給傳給了被調(diào)函數(shù)。了被調(diào)函數(shù)。而后可在被調(diào)函數(shù)中而后可在被調(diào)函數(shù)中使用使用或或改改變變傳來的那些數(shù)組元素的值傳來的那些數(shù)組元素的值。但注意,若在。但注意,若在被調(diào)函數(shù)內(nèi)改變數(shù)組元素值的話,返回主調(diào)被調(diào)函數(shù)內(nèi)改變數(shù)組元素值的話,返回主調(diào)函數(shù)后,相應(yīng)實參數(shù)組元素的值也進(jìn)行了相函數(shù)后,相應(yīng)實參數(shù)組元素的值也進(jìn)行了相同的改變(同的改變(“雙向傳值雙向傳值”功能)。功能)。 數(shù)組參

43、數(shù)數(shù)組參數(shù)46例例1. 1. 讀如下程序,看執(zhí)行讀如下程序,看執(zhí)行后會顯示出什么結(jié)果后會顯示出什么結(jié)果? ?# #include include void void ProcessingFunc(intProcessingFunc(int b, b, intint num); / num); /函數(shù)原型函數(shù)原型/intint型數(shù)組形參型數(shù)組形參b b,通常省去對元素個數(shù)的指定通常省去對元素個數(shù)的指定/(/(當(dāng)然也可以進(jìn)行指定當(dāng)然也可以進(jìn)行指定!)!)void main() void main() intint A10=0,1,2,3,4,9,8,7,66,88; A10=0,1,2,3,4,9

44、,8,7,66,88;coutcout- before calling, ai= -n;- before calling, ai= -n;for(intfor(int i=0; i10; i+) i=0; i10; i+)coutcoutAi ; Ai ; coutcoutendlendl; ;47 ProcessingFunc(AProcessingFunc(A, 10); /, 10); /函數(shù)調(diào)用函數(shù)調(diào)用coutcout- after calling, ai= -n;- after calling, ai= -n;for(i=0; i10; i+)for(i=0; i10; i+) co

45、utcoutAi ; Ai ; coutcoutendlendl; ; 48void void ProcessingFunc(intProcessingFunc(int b, b, intint num) num) /數(shù)組形參數(shù)組形參b b,省去了對元素個數(shù)的指定省去了對元素個數(shù)的指定! !coutcout- in - in ProcessingFuncProcessingFunc, bi= -n; , bi= -n; for(intfor(int i=0; inum; i+) i=0; inum; i+)coutcoutbi ; bi ; coutcoutendlendl; ;intint

46、tmptmp=b0;=b0;b0=bnum-1;b0=bnum-1; bnum-1=bnum-1=tmptmp; ; b1+=100;b1+=100; 49程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后的顯示結(jié)果如下:- - before calling, ai= -before calling, ai= -0 1 2 3 4 9 8 7 66 880 1 2 3 4 9 8 7 66 88- in - in ProcessingFuncProcessingFunc, bi= -, bi= -0 1 2 3 4 9 8 7 66 880 1 2 3 4 9 8 7 66 88- after callin

47、g, ai= - after calling, ai= -88 101 2 3 4 9 8 7 66 088 101 2 3 4 9 8 7 66 050例例2. 2. 求求a a數(shù)組中前數(shù)組中前n n個整數(shù)個整數(shù)累加和的遞歸函數(shù)累加和的遞歸函數(shù)sumsum其中使用了數(shù)組形參與遞歸函數(shù)。其中使用了數(shù)組形參與遞歸函數(shù)。程序執(zhí)行后的輸出結(jié)果為程序執(zhí)行后的輸出結(jié)果為: :Input 6 integers:Input 6 integers:22 4 -2 9 100 322 4 -2 9 100 3s=136s=13651#include #include intint sum(intsum(int

48、a, a, intint n) n) if ( n=1 )if ( n=1 ) return a0; return a0;elseelse return ( an-1 + return ( an-1 + sum(a, n-1)sum(a, n-1) ); ); 52void main()void main()const const intint n=6; n=6;intint An; An; coutcoutInput n integers:Input n integers:endlendl; ;for(intfor(int i=0; in; i+) i=0; iAi;Ai;intint s

49、= sum(A, n); s = sum(A, n);coutcouts=ss=sendlendl; ; 53 程序中出現(xiàn)的所有名字(標(biāo)識符)都必須說明,每程序中出現(xiàn)的所有名字(標(biāo)識符)都必須說明,每個名字(變量名、常量名、參數(shù)名、函數(shù)名、類名、個名字(變量名、常量名、參數(shù)名、函數(shù)名、類名、對象名等)都在程序的一定范圍內(nèi)有意義,就是該對象名等)都在程序的一定范圍內(nèi)有意義,就是該名字的作用域。名字的作用域。 1. 1. 外部存儲屬性與靜態(tài)存儲屬性外部存儲屬性與靜態(tài)存儲屬性2 2名字的生存期與作用域名字的生存期與作用域5.5.4 5.5.4 變量與函數(shù)的作用域變量與函數(shù)的作用域54 一個一個C+C

50、+程序由一個主函數(shù)和若干用戶定義函數(shù)程序由一個主函數(shù)和若干用戶定義函數(shù)(或類)組成,當(dāng)程序的規(guī)模較大時,整個程序可(或類)組成,當(dāng)程序的規(guī)模較大時,整個程序可能被劃分為幾個程序文件,關(guān)鍵字能被劃分為幾個程序文件,關(guān)鍵字extern(extern(外部存儲外部存儲屬性屬性) )和和static(static(靜態(tài)存儲屬性靜態(tài)存儲屬性) )可以規(guī)定所說明的變可以規(guī)定所說明的變量名或函數(shù)名的作用域在一個程序文件范圍內(nèi)還是量名或函數(shù)名的作用域在一個程序文件范圍內(nèi)還是擴(kuò)展到程序文件之外。擴(kuò)展到程序文件之外。 外部存儲屬性與靜態(tài)存儲屬性外部存儲屬性與靜態(tài)存儲屬性55 C+ C+的存儲類別的存儲類別 存儲類

51、別主要是針對變量而言的。變量不僅具存儲類別主要是針對變量而言的。變量不僅具有數(shù)據(jù)類型(存儲空間大?。┯袛?shù)據(jù)類型(存儲空間大?。? , 而且還具有存儲類而且還具有存儲類別(所占存儲空間的期限,即生命期)。別(所占存儲空間的期限,即生命期)。 變量的存儲類別可分為以下四種:自動變量的存儲類別可分為以下四種:自動( (auto)auto)型、寄存器型、寄存器( (register)register)型、外部型、外部( (extern)extern)型、靜態(tài)型、靜態(tài)( (static)static)型。型。 56 使用顯式存儲類別時,變量說明的一般格式變?yōu)椋菏褂蔑@式存儲類別時,變量說明的一般格式變?yōu)椋?/p>

52、 , . , , . , ;n; 其中的其中的“”可以是可以是autoauto、registerregister、externextern、staticstatic四個關(guān)鍵字之一。四個關(guān)鍵字之一。 C+ C+程序的數(shù)據(jù)主要存放在如下兩個數(shù)據(jù)區(qū)之中,程序的數(shù)據(jù)主要存放在如下兩個數(shù)據(jù)區(qū)之中,一個稱為一個稱為靜態(tài)數(shù)據(jù)區(qū)靜態(tài)數(shù)據(jù)區(qū)(也稱(也稱全局?jǐn)?shù)據(jù)區(qū)全局?jǐn)?shù)據(jù)區(qū) - “ - “一旦分配,一旦分配,一直擁有一直擁有”),另一個稱為),另一個稱為動態(tài)數(shù)據(jù)區(qū)動態(tài)數(shù)據(jù)區(qū)(也稱(也稱堆棧數(shù)據(jù)區(qū)堆棧數(shù)據(jù)區(qū) - “- “入時分配并擁有,出時歸還兩手空入時分配并擁有,出時歸還兩手空”)。)。57 具有具有程序級程序級

53、作用域以及作用域以及文件級文件級作用域的那些變量被分配在靜態(tài)數(shù)據(jù)區(qū)作用域的那些變量被分配在靜態(tài)數(shù)據(jù)區(qū)之中。另外,具有之中。另外,具有staticstatic存儲類別存儲類別的變量也均被分配在靜態(tài)數(shù)據(jù)區(qū)之中。的變量也均被分配在靜態(tài)數(shù)據(jù)區(qū)之中。在程序執(zhí)行時,就為這種變量分配空間并進(jìn)行在程序執(zhí)行時,就為這種變量分配空間并進(jìn)行隱式初始化隱式初始化(將數(shù)值量初(將數(shù)值量初始化為始化為0 0,將字符量初始化為空格),將字符量初始化為空格),直到程序執(zhí)行結(jié)束時才釋放直到程序執(zhí)行結(jié)束時才釋放這些存這些存儲空間。儲空間。 具有其它具有其它局部作用域局部作用域的那些變量被分配在的那些變量被分配在動態(tài)數(shù)據(jù)區(qū)動態(tài)數(shù)據(jù)

54、區(qū)之中。在程序執(zhí)之中。在程序執(zhí)行時,行時,每遇每遇這種變量的作用域開始時這種變量的作用域開始時就為其分配就為其分配一次存儲空間(但并不一次存儲空間(但并不進(jìn)行隱式初始化),而后進(jìn)行隱式初始化),而后, , 在每遇這種變量的在每遇這種變量的作用域結(jié)束作用域結(jié)束時就時就立即釋放立即釋放它們所占據(jù)的存儲空間。它們所占據(jù)的存儲空間。 58 變量的存儲類別變量的存儲類別 (1) (1) 自動(自動(autoauto)變量與寄存器(變量與寄存器(registerregister)變量變量 這兩類變量都是局部變量。均被分配在動態(tài)數(shù)據(jù)區(qū)之中。這兩類變量都是局部變量。均被分配在動態(tài)數(shù)據(jù)區(qū)之中。它們的它們的“生命

55、期生命期”僅在其作用域之內(nèi)。即是說,這兩類變量的僅在其作用域之內(nèi)。即是說,這兩類變量的作用域與作用域與“生命期生命期”具有一致性。具有一致性。 由于由于C+C+編譯器默認(rèn)所有在函數(shù)或塊內(nèi)說明的局部變量均為編譯器默認(rèn)所有在函數(shù)或塊內(nèi)說明的局部變量均為自動(自動(autoauto)變量變量, , 所以實用程序中根本不需要使用關(guān)鍵字所以實用程序中根本不需要使用關(guān)鍵字autoauto。 說明寄存器(說明寄存器(registerregister)變量時,必須使用存儲類別變量時,必須使用存儲類別registerregister。如果沒有足夠多的通用寄存器,則編譯器將它們按如果沒有足夠多的通用寄存器,則編譯

56、器將它們按自動(自動(autoauto)變量來處理。變量來處理。 59 (2) (2) 外部(外部(externextern)變量變量 外部(外部(externextern)變量變量在所有的函數(shù)、類和名字空間之外說在所有的函數(shù)、類和名字空間之外說明的變量的作用域從被說明點開始,到所在的程序文件結(jié)束明的變量的作用域從被說明點開始,到所在的程序文件結(jié)束具具有有程序級作用域程序級作用域。它們被分配在靜態(tài)數(shù)據(jù)區(qū)之中。即是說,它。它們被分配在靜態(tài)數(shù)據(jù)區(qū)之中。即是說,它們是們是作用域最大且作用域最大且“生命期生命期”最長最長的一種變量。的一種變量。在另一個程序在另一個程序文件中如果需要使用同一個變量的話,

57、必須把這個變量說明為文件中如果需要使用同一個變量的話,必須把這個變量說明為外部(外部(externextern)的,表示這個變量的說明不在本程序文件中,)的,表示這個變量的說明不在本程序文件中,而在原文件而在原文件之中。之中。60 (3) (3) 靜態(tài)靜態(tài)( (static)static)變量變量 又可分為又可分為局部靜態(tài)局部靜態(tài)變量和變量和全局靜態(tài)全局靜態(tài)變量。局部靜態(tài)變量是變量。局部靜態(tài)變量是指在函數(shù)或塊指在函數(shù)或塊的內(nèi)部說明的靜態(tài)變量,它的作用域是局部的;的內(nèi)部說明的靜態(tài)變量,它的作用域是局部的;對于局部變量:增加對于局部變量:增加staticstatic說明,使其生存期擴(kuò)展到整個程序。

58、說明,使其生存期擴(kuò)展到整個程序。而全局靜態(tài)變量指的是在所有函數(shù)的外部說明的具有單文件級而全局靜態(tài)變量指的是在所有函數(shù)的外部說明的具有單文件級全局性的靜態(tài)變量。靜態(tài)全局變量的生存期為整個程序,作用全局性的靜態(tài)變量。靜態(tài)全局變量的生存期為整個程序,作用域為本程序文件,不可擴(kuò)展。域為本程序文件,不可擴(kuò)展。 兩種靜態(tài)變量都被分配在靜態(tài)數(shù)據(jù)區(qū)之中,即是說,它們的兩種靜態(tài)變量都被分配在靜態(tài)數(shù)據(jù)區(qū)之中,即是說,它們的“生命期生命期”都與整個程序的執(zhí)行期相同都與整個程序的執(zhí)行期相同。 對于函數(shù):一般(類外)函數(shù)的生存期和作用域為整個程序,對于函數(shù):一般(類外)函數(shù)的生存期和作用域為整個程序,靜態(tài)屬性的函數(shù)的作

59、用域被限于所在的程序文件,這時,該函靜態(tài)屬性的函數(shù)的作用域被限于所在的程序文件,這時,該函數(shù)不能在其它程序文件中使用。數(shù)不能在其它程序文件中使用。 61 函數(shù)的存儲類別函數(shù)的存儲類別 函 數(shù) 也 分 為 兩 種 存 儲 類 別 , 一 種 是 外 部函 數(shù) 也 分 為 兩 種 存 儲 類 別 , 一 種 是 外 部(externextern)存儲類別,另一種是靜態(tài)(存儲類別,另一種是靜態(tài)(staticstatic)存存儲類別。儲類別。 (1) (1) 外部外部( (extern)extern)函數(shù)函數(shù) 具有外部(具有外部(externextern)存儲類別的函數(shù)稱為外部存儲類別的函數(shù)稱為外部(

60、externextern)函數(shù)。這種函數(shù)具有程序級作用域。當(dāng)函數(shù)。這種函數(shù)具有程序級作用域。當(dāng)函數(shù)定義時沒給出存儲類別時,系統(tǒng)默認(rèn)它為外部函數(shù)定義時沒給出存儲類別時,系統(tǒng)默認(rèn)它為外部(externextern)存儲類別,所以實用程序中幾乎從不使存儲類別,所以實用程序中幾乎從不使用用externextern來說明外部函數(shù)。來說明外部函數(shù)。 62 例如,如下的兩個函數(shù)說明是完全等價的。例如,如下的兩個函數(shù)說明是完全等價的。intint funcfunc()() externextern intint funcfunc()() (2) (2) 靜態(tài)靜態(tài)( (static)static)函數(shù)函數(shù) 具有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論