




已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
在結構化程序設計中,函數(shù)是將任務進行模塊劃分的基本單位。,第四章函數(shù),在面向對象的程序設計中,對數(shù)據(jù)的操作總是封裝在函數(shù)中,一個函數(shù)描述一種操作。不要完全按模塊思想講。也是讓學生處于面向對象程序設計的氛圍中。這樣第5章的教學會順利一些。,要掌握函數(shù)的使用,必須理解函數(shù)調用時的內部實現(xiàn)機制,以及與此相關的內存分配機制、變量生命期和作用域。,本章還將介紹關于函數(shù)重載的概念,介紹遞歸算法、內聯(lián)函數(shù)、默認參數(shù)函數(shù)以及多文件組織、編譯預處理、工程文件的概念和運行庫函數(shù)。,第四章函數(shù),41函數(shù)的定義與調用,45作用域與存儲類型,44函數(shù)調用機制,43全局變量和局部變量,42函數(shù)的參數(shù)傳遞,返回值及函數(shù)原型說明,410編譯預處理,49頭文件與多文件結構,48C+的系統(tǒng)庫函數(shù),47函數(shù)的一些高級議題,46函數(shù)的遞歸調用,4.1函數(shù)的定義與調用,4.1.1函數(shù)概述,4.1.2函數(shù)的定義,4.1.3函數(shù)的調用,4.1.1函數(shù)概述,函數(shù)是C+程序的基本組成模塊。,通過函數(shù),可以把一個復雜任務分解成為若干個易于解決的小任務。充分體現(xiàn)結構化程序設計由粗到精,逐步細化的設計思想。,組成C+程序的若干函數(shù)中,有一個稱為main()(Winmain())函數(shù),是程序執(zhí)行的入口,它可以調用其他函數(shù)。而其他一般函數(shù)既可以調用也可以被調用。函數(shù)之間的調用關系見下圖:,4.1.1函數(shù)概述,4.1.1函數(shù)概述,函數(shù)按是否帶有參數(shù),分為:無參函數(shù)和有參函數(shù),4.1.1結束,函數(shù)按其是否系統(tǒng)預定義分為兩類:一類是編譯系統(tǒng)預定義的,稱為庫函數(shù)或標準函數(shù),如一些常用的數(shù)學計算函數(shù)、字符串處理函數(shù)、圖形處理函數(shù)、標準輸入輸出函數(shù)等。這些庫函數(shù)都按功能分類,集中說明在不同的頭文件中。用戶只需在自己的程序中包含某個頭文件,就可直接使用該文件中定義的函數(shù)。另一類是用戶自定義函數(shù),用戶可以根據(jù)需要將某個具有相對獨立功能的程序定義為函數(shù)。,4.1.2函數(shù)的定義,1.無參函數(shù),2.有參函數(shù),1無參函數(shù),定義格式為:數(shù)據(jù)類型函數(shù)名(void)函數(shù)體,例:下面函數(shù)的功能是打印一個表頭voidTableHead()cout*endl;cout*example*endl;cout*=y?x:y);voidmain()floatx,y;coutxy;coutx和y中較大數(shù)為max(x,y)endl;,4.2函數(shù)的參數(shù)傳遞、返回值及函數(shù)原型說明,421函數(shù)的參數(shù)傳遞及傳值調用,423函數(shù)原型說明,422函數(shù)返回值,函數(shù)調用首先要進行參數(shù)傳遞,參數(shù)傳遞的方向是由實參傳遞給形參。傳遞過程是,先計算實參表達式的值,再將該值傳遞給對應的形參變量。一般情況下,實參和形參的個數(shù)和排列順序應一一對應,并且對應參數(shù)應類型匹配(賦值兼容),即實參的類型可以轉化為形參類型。而對應參數(shù)的參數(shù)名則不要求相同。,4.2.1函數(shù)的參數(shù)傳遞及傳值調用,按照參數(shù)形式的不同,C+有兩種調用方式:傳值調用和引用調用。顧名思義,傳值調用傳遞的是實參的值,本章主要介紹傳值調用。關于引用調用,將在第五章類與對象中介紹。,4.2.1函數(shù)的參數(shù)傳遞及傳值調用,調用power(4.6,3),函數(shù)power(4.6,3),return97.336,主程序后續(xù)語句,【例42】說明實參和形參對應關系的示例。#include#includefloatpower(floatx,intn)/求x的n次冪floatpow=1;while(n-)pow*=x;returnpow;voidmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;,4.2.1函數(shù)的參數(shù)傳遞及傳值調用,調用power(a,3),函數(shù)power(a,3),return912673,主程序后續(xù)語句,【例42】說明實參和形參對應關系的示例。#include#includefloatpower(floatx,intn)/求x的n次冪floatpow=1;while(n-)pow*=x;returnpow;voidmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;,4.2.1函數(shù)的參數(shù)傳遞及傳值調用,調用power(3,4.6),函數(shù)power(3,4.6),return81,主程序后續(xù)語句,【例42】說明實參和形參對應關系的示例。#include#includefloatpower(floatx,intn)/求x的n次冪floatpow=1;while(n-)pow*=x;returnpow;voidmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)bc;area=TriangleArea(a,b,c);if(area=-1)cout(a,b,c)不能構成三角形!endl;elsecout三角形(a,b,c)面積為:areachoice;while(choice=4);switch(choice)case1:account_report();break;case2:engineering_report();break;case3:marketing_report();break;,voidmenu_print()cout”系統(tǒng)功能:”endl;cout”1財務報表”endl;cout”2工程報表”endl;cout”3市場報表”endl;cout”選擇業(yè)務序號:”;voidaccount_report()/生成財務報表voidengineering_report()/生成工程報表voidmarketing_report()/生成市場報表;,4.2.3函數(shù)原型說明,【例44】輸出所有滿足下列條件的正整數(shù)m:10m1000且m、m2、m3均為回文數(shù)。,分析:回文指左右對稱的序列。如121、353等就是回文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實現(xiàn),其思想是將該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原數(shù)相等則為回文數(shù)。,程序如下:#include#includeboolpalindrome(int);/函數(shù)原型,voidmain()cout0);for(intj=0;ji;j+)n=n*10+digitj;return(n=m);,4.2.3函數(shù)原型說明,mm*mm*m*m111211331101102011030301111123211367631,運行結果:,4.3全局變量和局部變量,431變量的存儲機制與C+的內存布局,432全局變量,433局部變量,4.3.1變量的存儲機制與C+的內存布局,操作系統(tǒng)為一個C+程序的運行所分配的內存分為四個區(qū)域,如圖4.3程序在內存中的區(qū)域所示:,(1)代碼區(qū)(Codearea):存放程序代碼,即程序中各個函數(shù)的代碼塊;(2)全局數(shù)據(jù)區(qū)(Dataarea):存放全局數(shù)據(jù)和靜態(tài)數(shù)據(jù);分配該區(qū)時內存全部清零。(3)棧區(qū)(Stackarea):存放局部變量,如函數(shù)中的變量等;分配棧區(qū)時內存不處理。(4)堆區(qū)(Heaparea):存放與指針相關的動態(tài)數(shù)據(jù)。分配堆區(qū)時內存不處理。參見第七章。,4.3.1變量的存儲機制與C+的內存布局,4.3.2全局變量,在所有函數(shù)之外定義的變量稱為全局變量。,全局變量在編譯時建立在全局數(shù)據(jù)區(qū),在未給出初始化值時系統(tǒng)自動初始化為全0。,全局變量可定義在程序開頭,也可定義在中間位置,該全局變量在定義處之后的任何位置都是可以訪問的,稱為可見的。,請看下例:,4.3.2全局變量,打印200,調用func(),函數(shù)func(),200*2=400,打印400,n=100,n=100*2=200,【例45】多個函數(shù)使用全局變量的例子。#includeintn=100;voidfunc()n*=2;voidmain()n*=2;coutnendl;func();coutnendl;,4.3.3局部變量,定義在函數(shù)內或塊內的變量稱為局部變量。,程序中使用的絕大多數(shù)變量都是局部變量。,局部變量在程序運行到它所在的塊時建立在棧中,該塊執(zhí)行完畢局部變量占有的空間即被釋放。,局部變量在定義時可加修飾詞auto,但通常省略。局部變量在定義時若未初始化,其值為隨機數(shù)。,4.3.3局部變量,打印main()中的t=3.5,調用fun(),函數(shù)fun(),打印fun()中的t=5,打印main()中的t=3.5,t=5,【例49】使用局部變量的例子。#includevoidfun()autointt=5;/fun()中的局部變量,auto可省略coutfun()中的t=tendl;voidmain()floatt=3.5;/main()函數(shù)中的局部變量coutmain()中的t=tendl;fun();coutmain()中的t=tb;cout=a)intt;/具有塊域t=a;a=b;b=t;/交換a,b的值couta=atb=bb;cout調用前:實參a=a,b=bendl;swap(a,b);/傳值cout調用后:實參a=a,b=bendl;voidswap(inta,intb)/a,b作用域為swap()cout調用中endl;cout交換前:形參a=a,b=bendl;intt;t=a;a=b;b=t;/交換swap()中的a,b的值cout交換后:形參a=a,b=bendl;,塊作用域,由VC+平臺運行,結果如下:輸入兩整數(shù):35調用前:實參a=3,b=5調用中交換前:形參a=3,b=5交換后:形參a=5,b=3調用后:實參a=3,b=5交換失敗,局部變量具有局部作用域使得程序在不同塊中可以使用同名變量。這些同名變量各自在自己的作用域中可見,在其它地方不可見。,塊作用域,對于塊中嵌套其它塊的情況,如果嵌套塊中有同名局部變量,服從局部優(yōu)先原則,即在內層塊中屏蔽外層塊中的同名變量,換句話說,內層塊中局部變量的作用域為內層塊;外層塊中局部變量的作用域為外層除去包含同名變量的內層塊部分。,如果塊內定義的局部變量與全局變量同名,塊內仍然局部變量優(yōu)先,但與塊作用域不同的是,在塊內可以通過域運算符“:”訪問同名的全局變量。,200300,內i=500,內j=600,內n=500+600=1100,1100500600,100,200+300=500,500,500200300,外部i=200,外部j=300,【例49】顯示同名變量可見性。intn=100;#includevoidmain()inti=200,j=300;coutntitjendl;/內部塊inti=500,j=600,n;n=i+j;coutntitjendl;/輸出局部變量ncout:nendl;/輸出全局變量nn=i+j;/修改全局變量coutntitjendl;,函數(shù)原型作用域,函數(shù)原型不是定義函數(shù),在作函數(shù)原型聲明時,其中的形參作用域只在原型聲明中,即作用域結束于右括號。正是由于形參不能被程序的其他地方引用,所以通常只要聲明形參個數(shù)和類型,形參名可省略。,3文件作用域,文件作用域也稱全局作用域。定義在所有函數(shù)之外的標識符,具有文件作用域,作用域為從定義處到整個源文件結束。文件中定義的全局變量和函數(shù)都具有文件作用域。如果某個文件中說明了具有文件作用域的標識符,該文件又被另一個文件包含,則該標識符的作用域延伸到新的文件中。如cin和cout是在頭文件iostream.h中說明的具有文件作用域的標識符,它們的作用域也延伸到嵌入iostream.h的文件中。,存儲類型決定了變量的生命期,變量生命期指從獲得空間到空間釋放之間的時期。,4.5.2變量的存儲類型,存儲類型的說明符有四個:auto,register,static和extern。前兩者稱為自動類型,后兩者分別為靜態(tài)和外部類型。,本節(jié)重點掌握static和extern這兩種類型的使用和區(qū)別。具體說,區(qū)分局部變量和靜態(tài)局部變量,全局變量和靜態(tài)全局變量。,auto:前面提到的局部變量都是自動類型。其空間分配于塊始,空間釋放于塊終,且由系統(tǒng)自動進行。自動變量保存在棧中,且是在程序運行過程中獲得和釋放空間,未初始化時值為隨機數(shù)。,4.5.2變量的存儲類型,register:為提高程序運行效率,可以將某些變量保存在寄存器中,即說明為寄存器變量,但不提倡使用。,static:靜態(tài)變量。根據(jù)被修飾變量的位置不同,分為局部(內部)靜態(tài)變量和全局(外部)靜態(tài)變量。所有靜態(tài)變量均存放在全局數(shù)據(jù)區(qū),編譯時獲得存儲空間,未初始化時自動全0,且只初始化一次。,局部靜態(tài)變量的作用域為塊域,但生命期為整個文件。即當塊結束時,局部靜態(tài)變量空間仍然保持,直到整個程序文件結束時該局部靜態(tài)變量空間才釋放,生命期結束。,局部靜態(tài)變量,【例410】自動變量與局部靜態(tài)變量的區(qū)別。(演示),#includest()staticintt=100;/局部靜態(tài)變量t+;returnt;at()intt=100;/自動變量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;coutendl;,4.5.2變量的存儲類型,1,2,3,4,5,101,101,101,101,101,4.5.2變量的存儲類型,1,2,101,3,4,5,102,103,104,105,#includest()staticintt=100;/局部靜態(tài)變量t+;returnt;at()intt=100;/自動變量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;coutendl;,全局靜態(tài)變量,全局靜態(tài)變量是指用static修飾的全局變量。有關內容在下節(jié)靜態(tài)存儲類型中介紹。,4.5.3外部存儲類型與靜態(tài)存儲類型,1.外部存儲類型,2.靜態(tài)存儲類型,一個C+程序可以由多個源程序文件組成,編譯系統(tǒng)將這若干個文件連接在一起,產(chǎn)生可執(zhí)行程序。外部存儲類型和靜態(tài)存儲類型確定了變量和函數(shù)在多文件程序中的聯(lián)絡關系。,1外部存儲類型,外部存儲類型包括外部變量和外部函數(shù)。在由多個源程序文件組成的程序中,如果一個文件要使用另一個文件中定義的全局變量或函數(shù),這些源程序文件之間通過外部類型的變量和函數(shù)進行溝通。,在一個文件中定義的全局變量和函數(shù)都缺省為外部的,即其作用域可以延伸到程序的其他文件中。但其他文件如果要使用這個文件中定義的全局變量和函數(shù),必須在使用前用“extern”作外部聲明,外部聲明通常放在文件的開頭。,變量定義時編譯器為其分配存儲空間,而變量聲明指明該全局變量已在其他地方說明過,編譯系統(tǒng)不再分配存儲空間,直接使用變量定義時所分配的空間。,函數(shù)聲明缺省為外部的,因此修飾詞extern通常省略。,1外部存儲類型,【例4.11】外部存儲類型的例子。假定程序包含兩個源程序文件Ex4_11_1.cpp和Ex4_11_2.cpp,程序結構如下:/*Ex4_11_1.cpp,由main()組成*/#includevoidfun2();/外部函數(shù)聲明,等價于externvoidfun2();intn;/全局變量定義voidmain()n=1;fun2();/fun2()定義在文件Ex4_11_2.cpp中coutn=nendl;/*Ex4_11_2.cpp,由fun2()組成*/externintn;/外部變量聲明,n定義在文件Ex4_11_1.cpp中voidfun2()/fun2()被文件Ex4_11_1.cpp中的函數(shù)調用n=3;運行結果:n=3,2靜態(tài)存儲類型,靜態(tài)存儲類型包括靜態(tài)全局變量和靜態(tài)函數(shù)。在定義全局變量或函數(shù)時加說明符static,就成為靜態(tài)變量或靜態(tài)函數(shù)。靜態(tài)存儲類型的作用域與外部存儲類型相反,一旦定義為靜態(tài)存儲類型,就限制該變量或函數(shù)只能在定義它的文件中使用。靜態(tài)全局變量在編譯時分配存儲空間,如果定義時不指定初值,則編譯系統(tǒng)將其初始化為全0。,一個全局變量和一個靜態(tài)全局變量在使用上是不同的,其他文件通過外部變量聲明可以使用一個全局變量,但卻無法使用靜態(tài)全局變量,靜態(tài)全局變量只能被定義它的文件所獨享。函數(shù)與靜態(tài)函數(shù)之間的區(qū)別是相同的。,4.5.4生命期與可見性,1.生命期,2.可見性,1生命期,(1)靜態(tài)生命期,(2)局部生命期,(3)動態(tài)生命期,生命期(Lifetime)也叫生存期。生命期與存儲區(qū)域相關,存儲區(qū)域分為代碼區(qū)、靜態(tài)數(shù)據(jù)區(qū)、棧區(qū)和堆區(qū),相應地,生命期分為靜態(tài)生命期、局部生命期和動態(tài)生命期。,(1)靜態(tài)生命期,靜態(tài)生命期指的是標識符從程序開始運行時存在,即具有存儲空間,到程序運行結束時消亡,即釋放存儲空間。具有靜態(tài)生命期的標識符存放在靜態(tài)數(shù)據(jù)區(qū),屬于靜態(tài)存儲類型,如全局變量、靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標識符在未被用戶初始化的情況下,系統(tǒng)會自動將其初始化為全0。函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具有文件作用域的標識符都具有靜態(tài)生命期。,(2)局部生命期,在函數(shù)內部或塊中定義的標識符具有局部生命期,其生命期開始于執(zhí)行到該函數(shù)或塊的標識符聲明處,結束于該函數(shù)或塊的結束處。具有局部生命期的標識符存放在棧區(qū)。具有局部生命期的標識符如果未被初始化,其內容是隨機的,不可用。具有局部生命期的標識符必定具有局部作用域;但反之不然,靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。,(3)動態(tài)生命期,具有動態(tài)生命期的標識符由特定的函數(shù)調用或運算來創(chuàng)建和釋放,如調用malloc()或用new運算符為變量分配存儲空間時,變量的生命期開始,而調用free()或用delete運算符釋放空間或程序結束時,變量生命期結束。具有動態(tài)生命期的變量存放在堆區(qū)。關于new運算和delete運算將在指針一章中介紹。,可見性,可見性從另一個角度說明標識符的有效性,可見性與作用域具有一定的一致性。標識符的作用域包含可見范圍,可見范圍不會超過作用域??梢娦栽诶斫馔麡俗R符的作用域嵌套時十分直觀。對于外層塊與內層塊定義了同名標識符的,在外層作用域中,內層所定義的標識符是不可見的,即外層引用的是外層所定義的標識符;同樣,在內層作用域中,外層的標識符將被內層的同名標識符屏蔽,變得不可見,即外層中同名標識符的可見范圍為作用域中挖去內層塊的范圍。圖4.6顯示下面程序段中變量的作用域與可見性。,可見性,下面的程序段和圖示顯示作用域與可見性。intm=1;floatx;floatm=3.5;X=5.5;m+;,intm,floatx作用域intm可見floatm不可見x可見,floatm作用域floatm可見intm不可見x可見,4.6函數(shù)的遞歸調用,遞歸是一種描述問題的方法,或稱算法。遞歸的思想可以簡單地描述為“自己調用自己”。例如用如下方法定義階乘:,可以看出是用階乘定義階乘,這種自己定義自己的方法稱為遞歸定義。,在函數(shù)調用中,有這樣兩種情況,一種是在函數(shù)A的定義中有調用函數(shù)A的語句,即自己調用自己;另一種是函數(shù)A的定義中出現(xiàn)調用函數(shù)B的語句,而函數(shù)B的定義中也出現(xiàn)調用函數(shù)A的語句,即相互調用。前者稱直接遞歸,后者稱間接遞歸。本節(jié)只介紹直接遞歸。遞歸函數(shù)必須定義遞歸終止條件(Stoppingcondition),避免無窮遞歸(InfiniteRecursion)。遞歸定義的階乘算法用函數(shù)描述為:fac(intn)if(n=0|n=1)return1;elsereturnn*fac(n-1);只要設計主函數(shù)調用階乘函數(shù),即可實現(xiàn)計算階乘。,4.6函數(shù)的遞歸調用,【例412】求4!#includeintfac(intn)inty;coutnt;if(n=0|n=1)y=1;elsey=n*fac(n-1);coutyt;returny;voidmain()coutn4!=fac(4)endl;,n=4,cout4;y=4*fac(3);,fac(4)=,cout2;y=2*fac(1);,n=2,cout1;y=1;cout1;return1;,n=1,n=3,cout3;y=3*fac(2);,cout24;return24;,cout6;return6;,coutn;cout原整數(shù):nendl反向數(shù):;backward(n);coutendl;,4.6函數(shù)的遞歸調用,n=247,cout7;backward(24);,n=2,cout2;return;,n=24,cout4;backward(2);,backward(247),return;,return;,coutendl;,求余總是取當前整數(shù)的最右一位,所以先輸出余數(shù)后遞歸可實現(xiàn)倒序輸出。如果先遞歸后輸出余數(shù),則是在回歸的過程中輸出,實現(xiàn)的就是正序輸出。,從以上幾例可以看出,遞歸算法一般不需要借助循環(huán),但通過不斷遞推和回歸的過程實現(xiàn)了其他算法用循環(huán)完成的功能。因此,遞歸的終止條件非常重要,否則將會無休止地遞歸下去,陷入死循環(huán)狀態(tài)。,【例4.15】在【例3.11】中采用遞推法求解Fibonacii數(shù)列,本例用遞歸法求解。本例的遞歸調用過程參見圖4.11。#include#includeintfib(intn)if(n=0)return0;elseif(n=1)return1;elsereturnfib(n-1)+fib(n-2);voidmain()for(inti=0;i=19;i+)/將19改為69,可以看出計算到后面越來越緩慢。if(i%5=0)coutendl;coutsetw(6)fib(i);coutendl;,4.6函數(shù)的遞歸調用,圖4.11遞歸求解斐波那契數(shù)列調用樹,同其他算法相比,用遞歸算法編制的程序非常簡潔易讀,但缺點是增加了內存的開銷,在遞推的過程中會占用大量??臻g,且連續(xù)的調用返回操作占用較多CPU時間。因此是否選擇使用遞歸算法取決于所解決的問題及應用的場合。,4.6函數(shù)的遞歸調用,4.7函數(shù)的一些高級議題,471函數(shù)重載,472缺省變元,473內聯(lián)函數(shù),4.7.1函數(shù)重載,在C+中,如果需要定義幾個功能相似,而參數(shù)類型不同的函數(shù),那么這樣的幾個函數(shù)可以使用相同的函數(shù)名,這就是函數(shù)重載。例如求和函數(shù),對應不同的參數(shù)類型,可以定義如下幾個重載函數(shù):sum(inta,intb)/不寫返回類型,返回整型doublesum(doublea,doubleb)floatsum(floata,floatb,floatc),當某個函數(shù)中調用到重載函數(shù)時,編譯器會根據(jù)實參的類型去對應地調用相應的函數(shù)。匹配過程按如下步驟進行:(1)如果有嚴格匹配的函數(shù),就調用該函數(shù);(2)參數(shù)內部轉換后如果匹配,調用該函數(shù);(3)通過用戶定義的轉換尋求匹配。因此在定義重載函數(shù)時必須保證參數(shù)類型不同,僅僅返回值類型不同是不行的。函數(shù)重載的好處在于,可以用相同的函數(shù)名來定義一組功能相同或類似的函數(shù),程序的可讀性增強。,4.7.1函數(shù)重載,3+5=,調用sum(3,5),函數(shù)sum(3,5),return8,2.2+5.6=,調用sum(2.2,5.6),函數(shù)doublesum(2.2,5.6),return7.8,3.5+4+8=,調用sum(3.5,4,8),函數(shù)floatsum(3.5,4,8),return15.5,結束,8,7.8,15.5,【例416】重載函數(shù)的應用。#includesum(inta,intb)returna+b;Doublesum(doublea,doubleb)returna+b;floatsum(floata,floatb,floatc)returna+b+c;voidmain()cout3+5=sum(3,5)endl;cout2.2+5.6=“sum(2.2,5.6)endl;cout3.5+4+8=“sum(3.5,4,8)0;loops-);voidmain()delay(3);cout延時3個時間單位endl;delay();/等同于delay(5)cout延時5個時間單位=0因使用頻度很高,說明為內聯(lián)函數(shù)。,4.8C+的系統(tǒng)庫函數(shù),C+提供了一個很大的常用函數(shù)庫,該函數(shù)庫本身并不是C+語言的組成部分,所有庫中的函數(shù)用戶都可以自己定義,但直接使用庫函數(shù)能給編程帶來很大方便。系統(tǒng)函數(shù)庫實際上是一系列源程序文件,每個文件中定義了若干常用函數(shù)及標識符,具有相同或相似功能的函數(shù)和標識符集中放在一個文件中。這些文件均以.h的形式命名,存放在系統(tǒng)目錄的include子目錄下。例如文件iostream.h中定義了與控制臺輸入輸出和文件輸入輸出相關對象和成員函數(shù),math.h中定義了大量數(shù)學函數(shù),string.h中定義了大量與字符串操作相關的函數(shù)。,49頭文件與多文件結構,491頭文件,考慮標識符在其他文件中的可見性。使用頭文件是很有效的方法。如:#include其中的iostream.h是系統(tǒng)定義的一個文件,這種以“.h”命名的文件稱為頭文件,系統(tǒng)定義的頭文件中定義了一些常用的公用標識符和函數(shù),用戶只要將頭文件包含進自己的文件,就可使頭文件中定義的標識符在用戶文件中變得可見,也就可以直接使用頭文件中定義的標識符和函數(shù)。,49頭文件與多文件結構,除了系統(tǒng)定義的頭文件外,用戶還可以自定義頭文件。對于具有外部存儲類型的標識符,可以在其他任何一個源程序文件中經(jīng)聲明后引用,因此用戶完全可以將一些具有外部存儲類型的標識符的聲明放在一個頭文件中。具體地說,頭文件中可以包括:用戶構造的數(shù)據(jù)類型(如枚舉類型),外部變量,外部函數(shù)、常量和內聯(lián)函數(shù)等具有一定通用性或常用的量,而一般性的變量和函數(shù)定義不宜放在頭文件中。,492多文件結構,在開發(fā)較大程序時,通常將其分解為多個源程序文件,每個較小的程序用一個源程序文件建立。程序經(jīng)過建立、編譯、連接,成為一個完整的可執(zhí)行程序。多文件結構通過工程進行管理,在工程中建立若干用戶定義的頭文件.h和源程序文件.cpp。頭文件中定義用戶自定義的數(shù)據(jù)類型,所有的程序實現(xiàn)則放在不同的源程序文件中。編譯時每個源程序文件單獨編譯,如果源程序文件中有編譯預處理指令,則首先經(jīng)過編譯預處理生成臨時文件存放在內存,之后對臨時文件進行編譯生成目標文件.obj,編譯后臨時文件撤銷。所有的目標文件經(jīng)連接器連接最終生成一個完整的可執(zhí)行文件.exe。圖4.12是一個多文件系統(tǒng)的開發(fā)過程。,492多文件結構,編譯,預編譯,編譯,預編譯,預編譯,編譯,圖4.6C+程序開發(fā)過程,4.10編譯預處理,4101宏定義指令,4102文件包含指令,4103條件編譯指令,4.10.1宏定義指令#define,1不帶參宏定義用來產(chǎn)生與一個字符串對應的常量字符串,格式為:#define宏名常量串預處理后文件中凡出現(xiàn)該字符串處均用其對應的常量串代替。替換過程稱為宏替換或宏展開。例如,如果使用指令#definePI3.1415926則程序中可以使用標識符PI,編譯預處理后產(chǎn)生一個中間文件,文件中所有PI被替換為3.1415926。宏替換只是字符串和標識符
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 法律科技(LawTech)專員考試試卷及答案
- 2025年金溪縣遴選教師考試筆試試題【答案】
- 2025年海水淡化及水處理設備項目建議書
- 2025年山西省住房和城鄉(xiāng)建設廳下屬事業(yè)單位招聘考試筆試試題【答案】
- 2025年寧波市奉化區(qū)交通控股集團有限公司招聘考試筆試試題【答案】
- 2025年吉林省長白山公安局招聘警務輔助人員考試試題【答案】
- 2025年南寧市第十三中學招聘初中頂崗教師考試筆試試題【答案】
- 2025年樂山市沙灣區(qū)婦幼保健院招聘專技人員考試試題【答案】
- 2025年乙酸甲酯項目合作計劃書
- 大學生家具廠實習報告范文
- 易制毒化學品單位安全管理機構圖
- 陜西省幼兒教師通識性知識大賽考試題庫(含答案)
- 超級辯論賽辯論比賽流程主題課件
- 脊柱轉移性腫瘤臨床研究現(xiàn)狀與進展課件
- 銀行貿易融資業(yè)務介紹
- 跑步運動知識講座
- IATF16949質量體系審核檢查表2019
- 發(fā)電機應急預案處理方案
- 果皮箱、垃圾桶等公共維保潔方案
- 人防物防技防三位一體的施工安全防護體系
- 經(jīng)外周插管的中心靜脈導管(PICC)護理技術標準作業(yè)程序帶彩圖
評論
0/150
提交評論