




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1,第四章 過程抽象函數(shù),2,本章內(nèi)容,4.1 子程序 4.2 C+的函數(shù) 4.3 變量的局部性和變量的生存期 4.4 函數(shù)的嵌套調(diào)用 4.5 遞歸函數(shù) 4.6 宏定義 4.7 內(nèi)聯(lián)函數(shù) 4.8 帶缺省值的形式參數(shù) 4.9 函數(shù)名重載,3,基于過程抽象的程序設(shè)計(jì),人們在設(shè)計(jì)一個(gè)復(fù)雜的程序時(shí),經(jīng)常會用到功能分解和復(fù)合兩種手段: 功能分解:在進(jìn)行程序設(shè)計(jì)時(shí),首先把程序的功能分解成若干子功能,每個(gè)子功能又可以分解成若干子功能,等等,從而形成了一種自頂向下(top-down)、逐步精化(step-wise)的設(shè)計(jì)過程。 功能復(fù)合:把已有的(子)功能逐步組合成更大的(子)功能,從而形成一種自底向上(bo
2、ttom-up)的設(shè)計(jì)過程。 過程抽象:一個(gè)功能的使用者只需要知道相應(yīng)功能是什么(what to do),而不必知道它是如何做(how to do)的,4,4.1 子程序,子程序是取了名的一段程序代碼,在程序中通過名字來使用(調(diào)用)它們。 子程序的作用: 減少重復(fù)代碼,節(jié)省勞動力 實(shí)現(xiàn)過程抽象(功能抽象) 封裝和信息隱藏的作用 語言功能的擴(kuò)充,5,4.2 C+函數(shù),函數(shù):完成相對獨(dú)立功能的子程序. 標(biāo)準(zhǔn)庫函數(shù) (由系統(tǒng)定義,用戶可直接調(diào)用) 自定義函數(shù) (用戶需要時(shí), 自己定義,C語言函數(shù),6,4.2.1 C+標(biāo)準(zhǔn)庫函數(shù),為了方便程序設(shè)計(jì),C+語言的每個(gè)實(shí)現(xiàn)往往會提供一個(gè)標(biāo)準(zhǔn)庫,其中定義了一些
3、語言本身沒有提供的功能: 常用的數(shù)學(xué)函數(shù) 字符串處理函數(shù)以及 輸入/輸出,等等 在C+標(biāo)準(zhǔn)庫中,根據(jù)功能對定義的程序?qū)嶓w進(jìn)行了分類,把每一類程序?qū)嶓w的聲明分別放在一個(gè)頭文件中。 在C+中,把從C語言保留下來的庫函數(shù), 重新定義在名空間std中; 對相應(yīng)的頭文件進(jìn)了重新命名:*.h - c,7,一些標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(cmath或math.h,int abs( int n ); /int型的絕對值 long labs( long n ); /long int型的絕對值 double fabs( double x ); /double型的絕對值 double sin( double x ); /正弦函數(shù)
4、 double cos( double x ); /余弦函數(shù) double tan( double x ); /正切函數(shù) double asin( double x ); /反正弦函數(shù) double acos( double x ); /反余弦函數(shù) double atan( double x ); /反正切函數(shù) double ceil( double x ); /不小于x的最小整數(shù)(返回值為以 / / double表示的整型數(shù)) double floor( double x ); /不大于x的最大整數(shù)(返回值為以 / double表示的整型數(shù)) double log( double x );
5、/自然對數(shù) double log10( double x ); /以10為底的對數(shù) double sqrt( double x ); /平方根 double pow( double x, double y ); /x的y次冪,8,4.2.1 C+標(biāo)準(zhǔn)庫函數(shù),庫函數(shù)使用舉例 #include /相應(yīng)的頭文件 #include /相應(yīng)的頭文件 using namespace std; /重新定義在名空間std中; void main() double pi = 3.1415926535;double x, y;x = pi / 2;y = sin( x );cout sin( x ) = y en
6、dl ;y = cos( x );cout cos( x ) = y endl,9,4.2.2 自定義 C+函數(shù),1.函數(shù)的定義: () ; 描述了函數(shù)返回值的類型, 可以為任意的C+數(shù)據(jù)類型。 當(dāng)返回值類型為void時(shí),它表示函數(shù)沒有返回值。 用于標(biāo)識函數(shù)的名字,用標(biāo)識符表示。 描述函數(shù)的形式參數(shù),由零個(gè)、一個(gè)或多個(gè)形參說明(用逗號隔開)構(gòu)成,形參說明的格式為:,10,4.2.2 自定義 C+函數(shù),為一個(gè),用于實(shí)現(xiàn)相應(yīng)函數(shù)的功能。 函數(shù)體內(nèi)可以包含return語句,格式為: return ; return; 當(dāng)函數(shù)體執(zhí)行到return語句時(shí),函數(shù)立即返回到調(diào)用者。如果有返回值,則把返回值帶回
7、給調(diào)用者。 如果return中的的類型與函數(shù) 不一致,則進(jìn)行隱式類型轉(zhuǎn)換,基本原則為:把轉(zhuǎn)成 。 注意:在函數(shù)體中不能用goto語句轉(zhuǎn)出函數(shù)體,11,4.2.2 自定義 C+函數(shù),double max( double x, double y ) if ( x y )return x ;elsereturn y,函數(shù)定義舉例:求兩個(gè)浮點(diǎn)數(shù)中較大數(shù),12,4.2.2 自定義 C+函數(shù),每個(gè)C+程序都要定義一個(gè)名字為main的函數(shù),C+程序的執(zhí)行是從main開始的。對于函數(shù)main,其返回值類型為int,例如: int main() . . return -1; . return 0; 一般情況下,
8、返回0表示程序正常結(jié)束;返回負(fù)數(shù)(如1)表示程序非正常結(jié)束,2. 函數(shù)main,13,3.函數(shù)的調(diào)用,對于定義的一個(gè)函數(shù),必須要調(diào)用它,它的函數(shù)體才會執(zhí)行。 函數(shù)調(diào)用的格式如下: () 實(shí)參的個(gè)數(shù)和類型應(yīng)與相應(yīng)函數(shù)的形參相同。類型如果不同,編譯器會試圖進(jìn)行隱式轉(zhuǎn)換,轉(zhuǎn)換規(guī)則是把實(shí)參類型轉(zhuǎn)換成形參類型 。 注意:不能用goto語句從函數(shù)外轉(zhuǎn)入函數(shù)體,4.2.2 自定義 C+函數(shù),14,4.2.2 自定義 C+函數(shù),3. 函數(shù)調(diào)用舉例-1 #include using namespace std; float max(float x,float y) /必須分別定義 float z; z=xy?x
9、:y; return (z); void main() float a,b; int c; cinab; c=max(a,b); coutMax is cendl;,15,函數(shù)聲明,程序中調(diào)用的所有函數(shù)都要有定義。 如果函數(shù)定義在其它文件(如:C+的標(biāo)準(zhǔn)庫)中或定義在本源文件中使用點(diǎn)之后,則在調(diào)用前需要對被調(diào)用的函數(shù)進(jìn)行聲明。 函數(shù)聲明的格式如下: (); /函數(shù)原型 或 extern (); 在函數(shù)聲明中,中可以只列出形參的類型而不寫形參名,4.2.2 自定義 C+函數(shù),16,4.2.2 自定義 C+函數(shù),3. 函數(shù)調(diào)用舉例-2 #include #include using namespa
10、ce std; float max(float,float); / 函數(shù)聲明 void main() float a,b; int c; cinab; c=max(a,b); couty?x:y; return (z);,file2.cpp int g(int i) /定義 extern int x,y; /聲明 int z; /定義 z = x + y; return z+i;,file1.cpp int x=0; /定義 int main() /定義 extern void f(); /聲明 extern int g(int); /聲明 extern int y; /聲明 y = x +
11、2; f(); /調(diào)用 y = g(x); /調(diào)用 return 0; int y=0; /定義 void f() /定義 x = y + 1;,函數(shù)聲明的作用是什么,18,4.函數(shù)調(diào)用的執(zhí)行過程,計(jì)算實(shí)參的值(對于多個(gè)實(shí)參,C+沒有規(guī)定計(jì)算次序); 把實(shí)參分別傳遞給被調(diào)用函數(shù)的形參; 執(zhí)行函數(shù)體; 函數(shù)體中執(zhí)行return語句返回函數(shù)調(diào)用點(diǎn),調(diào)用點(diǎn)獲得返回值(如果有返回值)并執(zhí)行調(diào)用之后的操作,4.2.2 自定義 C+函數(shù),example4_5】用函數(shù)實(shí)現(xiàn)求小于n的所有素?cái)?shù),include #include using namespace std; bool is_prime(int n);
12、/函數(shù)聲明 void print_prime(int n, int count);/函數(shù)聲明 int main() int i,n,count=1; cout n; /從鍵盤輸入一個(gè)正整數(shù) if (n 2) return -1; cout 2 ,; /輸出第一個(gè)素?cái)?shù) for (i=3; in; i+=2) if (is_prime(i) count+; print_prime(i,count); cout endl; return 0;,bool is_prime(int n) int i,j,k=sqrt(n); for (i=2, j=k; i=j; i+) if (n%i = 0) re
13、turn 0; return 1; void print_prime(int n, int count) cout n ,; if (count % 6 = 0) cout endl;,20,4.2.3 函數(shù)的參數(shù)傳遞,C+提供了兩種參數(shù)傳遞機(jī)制: 值傳遞 把實(shí)參的值賦值給形參。 地址或引用傳遞 把實(shí)參的地址賦值給形參。 C+默認(rèn)的參數(shù)傳遞方式是值傳遞,21,值傳遞,在函數(shù)調(diào)用時(shí),采用類似變量初始化的形式把實(shí)參的值傳給形參。 函數(shù)執(zhí)行過程中,通過形參獲得實(shí)參的值。 函數(shù)體中對形參值的改變不會影響相應(yīng)實(shí)參的值,22,值參數(shù)傳遞的例子,include #include using namespac
14、e std; void swap(int a,int b) int t; t=a;a=b;b=t; couta=a,b=bendl; void main() int x=3,y=4; coutx=x,y=yendl; swap(x,y); coutx=x,y=yendl;,執(zhí)行main時(shí),產(chǎn)生2個(gè)變量(分配內(nèi)存空間)x和y: x: 3 y: 4 調(diào)用swap函數(shù)時(shí),又產(chǎn)生3個(gè)變量a、b和t: a: 3 b: 4 t: ? 函數(shù)swap中的交換結(jié)束后(函數(shù)返回前): a: 4 b: 3 t: 3 函數(shù)swap返回后: x: 3 y: 4,23,4.3 變量的作用域及存儲分配,1.局部變量和全局變
15、量 根據(jù)變量的定義位置,把變量分成:局部變量和全局變量。 局部變量是指在復(fù)合語句中定義的變量,它們只能在定義它們的復(fù)合語句(包括內(nèi)層的復(fù)合語句)中使用。 全局變量是指在函數(shù)外部定義的變量,它們一般能被程序中的所有函數(shù)使用(靜態(tài)的全局變量除外,24,4.3 變量的作用域及存儲分配,int x=0; /全局變量 void f() int y=0; /局部變量 x+; /OK y+; /OK a+; /Error,int main() int a=0; /局部變量 f(); a+; /OK x+; /OK y+; /Error while (x10) int b=0; /局部變量 a+; /OK b
16、+; /OK x+; /OK b+; /Error return 0;,全局變量和局部變量的區(qū)別,26,舉例1:全局變量應(yīng)用,include #include using namespace std; int a,b; /a,b為全局變量 void f1( ) int t1,t2; t1 = a * 2; t2 = b * 3; b = 100; coutt1=t1,t2=t2endl; void main( ) a=2; b=4; / 此a,b是全局變量,賦值 f1( ); / 調(diào)用函數(shù)f1( ) couta=a,b=bendl;,27,舉例2:全局變量和局部變量同名,include #in
17、clude using namespace std; int a=2,b=4; /a,b為全局變量 void f1( ) int t1,t2; t1 = a * 2; t2 = b * 3; b = 100; coutt1=t1,t2=t2endl; void main( ) int b=4; /同名局部變量 f1( ); couta=a,b=bendl;,全局變量與局部變量同名時(shí),則在局部變量的作用范圍內(nèi),外部變量不起作用,28,2.變量的生存期(存儲分配,1)把程序運(yùn)行時(shí)一個(gè)變量占有內(nèi)存空間的時(shí)間段稱為該變量的生存期。 靜態(tài):從程序開始執(zhí)行時(shí)就進(jìn)行內(nèi)存空間分配,直到程序結(jié)束才收回它們的空間
18、。全局變量具有靜態(tài)生存期 。 自動:內(nèi)存空間在程序執(zhí)行到定義它們的復(fù)合語句(包括函數(shù)體)時(shí)才分配,當(dāng)定義它們的復(fù)合語句執(zhí)行結(jié)束時(shí),它們的空間將被收回。局部變量和函數(shù)的參數(shù)一般具有自動生存期。 動態(tài) :內(nèi)存空間在程序中顯式地用new操作或malloc庫函數(shù)分配、用delete操作或free庫函數(shù)收回。動態(tài)變量具有動態(tài)生存期。 具有靜態(tài)生存期的變量,如果沒有顯式初始化,系統(tǒng)將把它們初始化成0,29,2)存儲類修飾符,auto:使局部變量具有自動生存期。局部變量的默認(rèn)存儲類為auto。 static:使局部變量具有靜態(tài)生存期。它只在函數(shù)第一次調(diào)用時(shí)進(jìn)行初始化,以后調(diào)用中不再進(jìn)行初始化,它的值為上一次
19、函數(shù)調(diào)用結(jié)束時(shí)的值。 register:使局部變量也具有自動生存期,由編譯程序根據(jù)CPU寄存器的使用情況來決定是否存放在寄存器中,2.變量的生存期(存儲分配,30,存儲特性數(shù)據(jù)類型 變量名,完整的變量定義,2.變量的生存期(存儲分配,auto型:每次進(jìn)入程序是自動分配內(nèi)存,不長期占用內(nèi)存 例如:形式參數(shù),自動型局部變量 static 型: 局部靜態(tài)變量 :靜態(tài)變量定義在函數(shù)中 全局靜態(tài)變量:靜態(tài)變量 定義在函數(shù)外 長期占用內(nèi)存,只進(jìn)行一次初始化,31,舉例3:變量生存期,include #include using namespace std; int f(int a) int b=0; st
20、atic int c=3; b+;c+; coutatbtct; return(a+b+c); void main() int a=2,k; for(k=0;k3;k+) coutf(a)endl;,32,3.程序?qū)嶓w在內(nèi)存中的安排,靜態(tài)數(shù)據(jù)區(qū)用于全局變量、static存儲類的局部變量以及常量的內(nèi)存分配 。 代碼區(qū)用于存放程序的指令,對C+程序而言,代碼區(qū)存放的是所有函數(shù)代碼; 棧區(qū)用于auto存儲類的局部變量、函數(shù)的形式參數(shù)以及函數(shù)調(diào)用時(shí)有關(guān)信息(如:函數(shù)返回地址等)的內(nèi)存分配; 堆區(qū)用于動態(tài)變量的內(nèi)存分配,33,4. 標(biāo)識符的作用域,為了對程序中的實(shí)體的名字進(jìn)行管理,引進(jìn)了標(biāo)識符的作用域的
21、概念。 一個(gè)定義了的標(biāo)識符的有效范圍(能被訪問的程序段)稱為該標(biāo)識符的作用域。 在不同的作用域中,可以用相同的標(biāo)識符來標(biāo)識不同的程序?qū)嶓w,34,4.C+標(biāo)識符的作用域,C+把標(biāo)識符的作用域分成若干類,其中包括: 局部作用域 全局作用域 文件作用域 函數(shù)作用域 函數(shù)原型作用域 類作用域 名空間作用域,35,1)局部作用域,在函數(shù)定義或復(fù)合語句中、從標(biāo)識符的定義點(diǎn)開始到函數(shù)定義或復(fù)合語句結(jié)束之間的程序段。 C+中的局部常量名、局部變量名/對象名以及函數(shù)的形參名具有局部作用域,4.C+標(biāo)識符的作用域,void f(int n) x+; /Error int x=0; x+; n+; . void g
22、() x+; /Error n+; /Error int main() int x=0; int n; cin n; f(n); .,如果在一個(gè)標(biāo)識符的局部作用域中包含內(nèi)層復(fù)合語句,并且在該內(nèi)層復(fù)合語句中定義了一個(gè)同名的不同實(shí)體,則外層定義的標(biāo)識符的作用域應(yīng)該是從其潛在作用域中扣除內(nèi)層同名標(biāo)識符的作用域之后所得到的作用域。 void f() int x; /外層x的定義 . x . /外層的x while ( . x .) /外層的x . x . /外層的x, double x; /內(nèi)層x的定義 . x . /內(nèi)層的x . x . /外層的x,38,2)全局作用域,在函數(shù)級定義的標(biāo)識符具有全局
23、作用域。 全局變量名/對象名、全局函數(shù)名和全局類名的作用域一般具有全局作用域,它們在整個(gè)程序中可用。 在局部標(biāo)識符的作用域中若要使用與其同名的全局標(biāo)識符,則需要用全局域選擇符(:)對全局標(biāo)識符進(jìn)行修飾(受限,4.C+標(biāo)識符的作用域,39,double x; /外層x的定義 void f() int x; /內(nèi)層x的定義 . x . /內(nèi)層的x . :x . /外層的x,4.C+標(biāo)識符的作用域,2)全局作用域,40,3)文件作用域,在全局標(biāo)識符的定義中加上static修飾符,則該全局標(biāo)識符就成了具有文件作用域的標(biāo)識符,它們只能在定義它們的源文件(模塊)中使用,4.C+標(biāo)識符的作用域,file1.
24、cpp static int y; /文件作用域 static void f() /文件作用域 . /file2.cpp extern int y; extern void f(); void g() . y . /Error f(); /Error,41,4)名空間作用域,對于一個(gè)多文件構(gòu)成的程序,有時(shí)會面臨一個(gè)問題:在一個(gè)源文件中要用到兩個(gè)分別在另外兩個(gè)源文件中定義的不同全局程序?qū)嶓w(如:全局函數(shù)),而這兩個(gè)全局程序?qū)嶓w的名字相同。 C+提供了名空間(namespace)設(shè)施來解決上述的名沖突問題。 在一個(gè)名空間中定義的全局標(biāo)識符,其作用域?yàn)樵撁臻g。 當(dāng)在一個(gè)名空間外部需要使用該名空間中
25、定義的全局標(biāo)識符時(shí),可用該名空間的名字來修飾或受限,4.C+標(biāo)識符的作用域,3,模塊2 namespace B int x=0; void f() .,A:x . /A中的x A:f(); /A中的f . B:x . /B中的x B:f(); /B中的f,using namespace A; . x . /A中的x f(); /A中的f . B:x . /B中的x B:f(); /B中的f,using A:f; . A:x . /A中的x f(); /A中的f . B:x . /B中的x B:f(); /B中的f,模塊3,1,2,43,4.4 函數(shù)的嵌套調(diào)用,函數(shù)的調(diào)用是可以嵌套的。 void
26、 h() . void g() . h(); . void f() . g(); .,44,直接遞歸 void f() . . f() . .,間接遞歸 extern void g(); void f() . . g() . . void g() . . f() . .,1.定義:如果一個(gè)函數(shù)在其函數(shù)體中直接或間接地調(diào)用了自己,則該函數(shù)稱為遞歸函數(shù),4.5 遞歸函數(shù),45,2.遞歸調(diào)用的條件,遞歸模型,遞歸終止條件,遞歸體,確定遞歸的方式將一個(gè)問題轉(zhuǎn)化成一個(gè)新問題,且解題方法相似,每一步轉(zhuǎn)化都越接近終止條件,4.5 遞歸函數(shù),46,example4_9】求第n個(gè)fibonacci 數(shù)(遞歸解法
27、,int fib(int n) if (n = 1 | n = 2) return 1; else return fib(n-2)+fib(n-1);,47,3.遞歸函數(shù)的執(zhí)行過程,用遞歸函數(shù)求n! int f(int n) if (n = 0) return 1; else return n*f(n-1);,48,example4_13】解漢諾塔問題,漢諾塔問題:有A,B,C三個(gè)柱子,柱子A上穿有n個(gè)大小不同的圓盤,大盤在下,小盤在上。現(xiàn)要把柱子A上的所有圓盤移到柱子B上,要求每次只能移動一個(gè)圓盤,且大盤不能放在小盤上,移動時(shí)可借助柱子C。編寫一個(gè)C+函數(shù)給出移動步驟,A B C,49,分析
28、,當(dāng)n=1時(shí),只要把1個(gè)圓盤從A移至B就可以了 cout B endl; 把n-1個(gè)圓盤從柱子C移到柱子B。 上面的子問題1和3與原問題相同,只是盤子的個(gè)數(shù)少了一個(gè)以及移動的位置不同;子問題2是移動一個(gè)盤子的簡單問題,include using namespace std; void hanoi(char x,char y,char z,int n) /n個(gè)圓盤,xy if (n = 1) cout yelse hanoi(x,z,y,n-1); /把n-1個(gè),x-z cout y hanoi(z,y,x,n-1); /把n-1個(gè)圓盤,z-y void main( ) int n; cout
29、n; hanoi(A,B,C,n);,51,4.遞歸與循環(huán)的選擇,對于一些遞歸定義的問題,用遞歸函數(shù)來解決會顯得比較自然和簡潔,而用循環(huán)來解決這樣的問題,有時(shí)會很復(fù)雜,不易設(shè)計(jì)和理解。 在實(shí)現(xiàn)數(shù)據(jù)的操作上,它們有一點(diǎn)不同: 循環(huán)是在同一組變量上進(jìn)行重復(fù)操作(循環(huán)常常又稱為迭代) 遞歸則是在不同的變量組(屬于遞歸函數(shù)的不同實(shí)例)上進(jìn)行重復(fù)操作。 遞歸的缺陷: 由于遞歸表達(dá)的重復(fù)操作是通過函數(shù)調(diào)用來實(shí)現(xiàn)的,而函數(shù)調(diào)用是需要開銷的; 棧空間的大小也會限制遞歸的深度。 遞歸算法有時(shí)會出現(xiàn)重復(fù)計(jì)算,52,解決小函數(shù)的低效問題,由于函數(shù)調(diào)用是需要開銷的,特別是對一些小函數(shù)的頻繁調(diào)用將使程序的效率有很大的降
30、低。 C+提供了兩種解決上述問題的辦法: 宏定義 內(nèi)聯(lián)函數(shù),53,4.6 宏定義,在C+中,利用一種編譯預(yù)處理命令:宏定義,用它可以實(shí)現(xiàn)類似函數(shù)的功能: #define凵()凵 例如: #define凵max(a,b)凵(a)(b)?(a):(b) 在編譯之前,將對宏的使用進(jìn)行文字替換! 例如:編譯前將把 cout (y)?(x):(y,54,宏定義的不足之處,需要加上很多的括號。例如: #define max(a,b) ab?a:b 10+max(x,y)+z 將被替換成: 10+xy?x:y+z 有時(shí)會出現(xiàn)重復(fù)計(jì)算。 例如: #define凵max(a,b)凵(a)(b)?(a):(b)
31、max(x+1,y*2)將被替換成: (x+1)(y*2)?(x+1):(y*2) 不進(jìn)行參數(shù)類型檢查和轉(zhuǎn)換。 不利于一些工具對程序的處理,55,include using namespace std; #define ADD(x) x+x void main() int m=1,n=2,k=3; int sum=ADD(m+n)*k; coutsum=sumendl; 上面程序的運(yùn)行結(jié)果是 A) sum=9 B) sum=10 C) sum=12 D) sum=18,56,4.7 內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)是指在定義函數(shù)定義時(shí),在函數(shù)返回類型之前加上一個(gè)關(guān)鍵詞inline,例如: inline in
32、t max(int a, int b) return ab?a:b; 內(nèi)聯(lián)函數(shù)的作用是建議編譯程序把該函數(shù)的函數(shù)體展開到調(diào)用點(diǎn),以提高函數(shù)調(diào)用的效率,57,4.7 內(nèi)聯(lián)函數(shù),使用內(nèi)聯(lián)函數(shù)時(shí)應(yīng)注意以下幾點(diǎn): 若inline不在函數(shù)名第一次出現(xiàn)時(shí)指定,則編譯器把它作為普通函數(shù)處理。 一般內(nèi)聯(lián)函數(shù)只適合于1到5行的小程序。 遞歸函數(shù)不能說明為內(nèi)聯(lián)函數(shù)。 為了防止同一個(gè)內(nèi)聯(lián)函數(shù)的各個(gè)定義之間的不一致,往往把內(nèi)聯(lián)函數(shù)的定義放在某個(gè)頭文件中,在需要使用該內(nèi)聯(lián)函數(shù)的源文件中用文件包含命令#include把該頭文件包含進(jìn)來。由于內(nèi)聯(lián)函數(shù)名具有文件作用域,因此,不會出現(xiàn)重復(fù)定義問題,舉例: 從鍵盤上輸入一串字符
33、,以回車結(jié)束,統(tǒng)計(jì)其中數(shù)字字符個(gè)數(shù),include #include inline int isnumber( char ) ; void main() char c ; int n ; n = 0 ; while( ( c= getchar() ) != n ) if (isnumber(c) ) n+; cout =0,59,4.8 帶缺省值的形式參數(shù),在C+中允許在聲明函數(shù)時(shí),為函數(shù)的某些參數(shù)指定默認(rèn)值。如果調(diào)用這些函數(shù)時(shí)沒有提供相應(yīng)的實(shí)參,則相應(yīng)的形參采用指定的默認(rèn)值。 例如,對于下面的函數(shù)聲明: void print(int value, int base=10); 下面的調(diào)用: p
34、rint(28); /28傳給value;10傳給base print(32,2); /28傳給value;2傳給base,60,4.8 帶缺省值的形式參數(shù),在指定函數(shù)參數(shù)的默認(rèn)值時(shí),應(yīng)注意下面幾點(diǎn): 有默認(rèn)值的形參應(yīng)處于形參表的右部。例如: void f(int a, int b=1, int c=0); /OK void f(int a, int b=1, int c); /Error 對參數(shù)默認(rèn)值的指定只在函數(shù)聲明(包括定義性聲明)處有意義。 在不同的源文件中,對同一個(gè)函數(shù)的聲明可以對它的同一個(gè)參數(shù)指定不同的默認(rèn)值; 在同一個(gè)源文件中,對同一個(gè)函數(shù)的聲明只能對它的每一個(gè)參數(shù)指定一次默認(rèn)值,61,4.9 函數(shù)名重載,對于一些功能相同、參數(shù)類型或個(gè)數(shù)不同的函數(shù),有時(shí)給它們?nèi)∠嗤拿謺硎褂蒙系姆奖?。例如,把下面的函?shù): void print_int(int i) . void print_double(double d) . void print_char(char c) . void print_A(A a) . /A為自定義類型 定義為: void print(int i) . void print(double d) . void print(char c) . void pri
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度珠寶首飾購銷合同(黃金系列)
- 二零二五年度旅游景區(qū)保安服務(wù)勞動合同
- 2025年度高空作業(yè)勞務(wù)承包與安全防護(hù)合同
- 二零二五年度單位房屋租賃合同(含綠化維護(hù)及環(huán)境保護(hù)責(zé)任)
- 2025年度知識產(chǎn)權(quán)戰(zhàn)略規(guī)劃法律顧問聘用協(xié)議
- 2025年度科技公司臨時(shí)用工服務(wù)合同
- 二零二五年度物流行業(yè)司機(jī)安全與責(zé)任協(xié)議
- 2025年度門面買賣合同(含品牌形象維護(hù)責(zé)任)
- 2025年度居民房屋租賃押金管理與退還合同
- 2025年度數(shù)據(jù)中心機(jī)房搬遷與IT設(shè)備維護(hù)保養(yǎng)服務(wù)合同
- 礦山開采與環(huán)境保護(hù)
- 企業(yè)事業(yè)部制的管理與監(jiān)督機(jī)制
- 兒童體液平衡及液體療法課件
- 勞動防護(hù)用品培訓(xùn)試卷帶答案
- ORACLE執(zhí)行計(jì)劃和SQL調(diào)優(yōu)
- 2024年鐘山職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 2024年湖南交通職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 研究生導(dǎo)師談心談話記錄內(nèi)容范文
- 小學(xué)機(jī)器人課題報(bào)告
- 《字體設(shè)計(jì)》課程標(biāo)準(zhǔn)
- 圖像生成中的風(fēng)格遷移方法研究
評論
0/150
提交評論