




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、面向?qū)ο蟪绦蛟O(shè)計(jì)(二)呂俊白第五章第五章函數(shù)機(jī)制函數(shù)機(jī)制主要內(nèi)容:主要內(nèi)容:函數(shù)的概念;函數(shù)的概念;函數(shù)的聲明、定義與調(diào)用;函數(shù)的聲明、定義與調(diào)用;函數(shù)參數(shù);函數(shù)參數(shù);遞歸函數(shù);遞歸函數(shù);函數(shù)重載函數(shù)重載main函數(shù)參數(shù);函數(shù)參數(shù);指針與函數(shù);指針與函數(shù);內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)重點(diǎn):重點(diǎn):n函數(shù)的聲明、定義與調(diào)用的語(yǔ)法;函數(shù)的參數(shù)傳遞。函數(shù)的聲明、定義與調(diào)用的語(yǔ)法;函數(shù)的參數(shù)傳遞。n遞歸函數(shù)及其應(yīng)用;函數(shù)重載;遞歸函數(shù)及其應(yīng)用;函數(shù)重載;n指針與函數(shù)指針與函數(shù)5.1函數(shù)的基本概念函數(shù)的基本概念函數(shù)是函數(shù)是C+程序結(jié)構(gòu)中的基本單位。程序結(jié)構(gòu)中的基本單位。1什么叫函數(shù)什么叫函數(shù)把實(shí)現(xiàn)特定功能的相關(guān)語(yǔ)句組
2、織在一起,并給出把實(shí)現(xiàn)特定功能的相關(guān)語(yǔ)句組織在一起,并給出相應(yīng)的名稱,就稱為函數(shù)。相應(yīng)的名稱,就稱為函數(shù)。2函數(shù)的作用函數(shù)的作用 ()便于程序?qū)崿F(xiàn);()便于程序?qū)崿F(xiàn); ()減少程序的重復(fù)編寫;()減少程序的重復(fù)編寫; ()使程序結(jié)構(gòu)清晰、增強(qiáng)易讀性。()使程序結(jié)構(gòu)清晰、增強(qiáng)易讀性。3函數(shù)的函數(shù)的分類分類n通常分為:標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶自定義函通常分為:標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶自定義函數(shù)兩大類。數(shù)兩大類。1.標(biāo)準(zhǔn)庫(kù)函數(shù)標(biāo)準(zhǔn)庫(kù)函數(shù)(簡(jiǎn)稱為庫(kù)函數(shù)簡(jiǎn)稱為庫(kù)函數(shù)):是:是C+系系統(tǒng)提供的可以為任何程序所使用的公共統(tǒng)提供的可以為任何程序所使用的公共函數(shù)。函數(shù)。2.用戶自定義函數(shù):是程序員編寫的用于用戶自定義函數(shù):是程
3、序員編寫的用于完成指定任務(wù)的函數(shù)。完成指定任務(wù)的函數(shù)。5.2 函數(shù)原型函數(shù)原型n函數(shù)在使用之前要先聲明。函數(shù)在使用之前要先聲明。nC+中函數(shù)的聲明總是由函數(shù)原型構(gòu)成的。中函數(shù)的聲明總是由函數(shù)原型構(gòu)成的。1什么叫函數(shù)原型什么叫函數(shù)原型n函數(shù)原型是一條特殊的說明語(yǔ)句,用來聲明程函數(shù)原型是一條特殊的說明語(yǔ)句,用來聲明程序中將調(diào)用的函數(shù)。序中將調(diào)用的函數(shù)。n函數(shù)原型由函數(shù)返回類型、函數(shù)名和參數(shù)表構(gòu)函數(shù)原型由函數(shù)返回類型、函數(shù)名和參數(shù)表構(gòu)成,以分號(hào)結(jié)束,并且一般放在程序的頂部。成,以分號(hào)結(jié)束,并且一般放在程序的頂部。2函數(shù)原型的語(yǔ)法函數(shù)原型的語(yǔ)法 (););例如:例如:double max(double
4、,double);注意:注意:(1)參數(shù)類型表給出函數(shù)所有參數(shù)的數(shù)據(jù)類型(無須給出參數(shù)類型表給出函數(shù)所有參數(shù)的數(shù)據(jù)類型(無須給出參數(shù)名);參數(shù)名);(2)函數(shù)原型和函數(shù)定義在函數(shù)類型(返回值類型)、函函數(shù)原型和函數(shù)定義在函數(shù)類型(返回值類型)、函數(shù)名以及參數(shù)表這三部分上必須完全一致,否則就會(huì)數(shù)名以及參數(shù)表這三部分上必須完全一致,否則就會(huì)發(fā)生編譯錯(cuò)誤;發(fā)生編譯錯(cuò)誤;(3)標(biāo)準(zhǔn)庫(kù)函數(shù)的原型都在對(duì)應(yīng)的頭文件中(標(biāo)準(zhǔn)庫(kù)函數(shù)的原型都在對(duì)應(yīng)的頭文件中(*.h)。)。如果程序中使用到某些標(biāo)準(zhǔn)庫(kù)函數(shù),必須在程序頂部使如果程序中使用到某些標(biāo)準(zhǔn)庫(kù)函數(shù),必須在程序頂部使用用#include命令將對(duì)應(yīng)的頭文件包含進(jìn)來
5、。命令將對(duì)應(yīng)的頭文件包含進(jìn)來。3函數(shù)原型的函數(shù)原型的作用作用n作用:作用:在程序中加入函數(shù)原型有利于保在程序中加入函數(shù)原型有利于保證函數(shù)定義和調(diào)用上的一致性。證函數(shù)定義和調(diào)用上的一致性。一致性:是指定義和調(diào)用時(shí)函數(shù)類型、參數(shù)個(gè)一致性:是指定義和調(diào)用時(shí)函數(shù)類型、參數(shù)個(gè)數(shù)和參數(shù)類型方面的一一對(duì)應(yīng)。數(shù)和參數(shù)類型方面的一一對(duì)應(yīng)。當(dāng)程序中加入函數(shù)原型,一旦函數(shù)原型與函數(shù)當(dāng)程序中加入函數(shù)原型,一旦函數(shù)原型與函數(shù)調(diào)用或函數(shù)定義不同,編譯系統(tǒng)會(huì)報(bào)告出錯(cuò),調(diào)用或函數(shù)定義不同,編譯系統(tǒng)會(huì)報(bào)告出錯(cuò),并給出相應(yīng)的出錯(cuò)信息。并給出相應(yīng)的出錯(cuò)信息。5.3函數(shù)定義函數(shù)定義n在程序中使用函數(shù)必須先定義后使用。在程序中使用函數(shù)
6、必須先定義后使用。1語(yǔ)法語(yǔ)法(參見參見P:136)C+的函數(shù)由函數(shù)頭部(函數(shù)原型)和函數(shù)體的函數(shù)由函數(shù)頭部(函數(shù)原型)和函數(shù)體兩部分組成。其語(yǔ)法描述為:兩部分組成。其語(yǔ)法描述為: ()/函數(shù)頭部函數(shù)頭部 /函數(shù)體函數(shù)體 數(shù)據(jù)說明部分?jǐn)?shù)據(jù)說明部分 ; ;解釋:解釋:n類型標(biāo)識(shí)符:用來說明函數(shù)的返回類型,類型標(biāo)識(shí)符:用來說明函數(shù)的返回類型,即函數(shù)調(diào)用所返回的結(jié)果的數(shù)據(jù)類型。即函數(shù)調(diào)用所返回的結(jié)果的數(shù)據(jù)類型。C+語(yǔ)言規(guī)定除了特別情形之外,所有函數(shù)都必須在說明語(yǔ)言規(guī)定除了特別情形之外,所有函數(shù)都必須在說明中指出返回類型。中指出返回類型。如果省略類型標(biāo)識(shí)符,則缺省類型是如果省略類型標(biāo)識(shí)符,則缺省類型是i
7、nt;如果函數(shù)無值返回,應(yīng)說明為如果函數(shù)無值返回,應(yīng)說明為void類型。類型。例如:例如:void print();/返回類型是返回類型是voiddouble max(double ,double ); /返回類型是返回類型是double注意:注意:函數(shù)的返回類型為函數(shù)的返回類型為非非void型型時(shí),函數(shù)體要用時(shí),函數(shù)體要用return返返回值,并且回值,并且return語(yǔ)句中表達(dá)式的類型必須與函數(shù)的返語(yǔ)句中表達(dá)式的類型必須與函數(shù)的返回類型相一致?;仡愋拖嘁恢?。解釋:解釋:n函數(shù)名:用來給函數(shù)命名,函數(shù)名:用來給函數(shù)命名,C+用標(biāo)識(shí)符來作為函數(shù)名。用標(biāo)識(shí)符來作為函數(shù)名。n 參數(shù)表:用來說明函數(shù)
8、的參數(shù),參數(shù)表:用來說明函數(shù)的參數(shù),函數(shù)的參數(shù)是函數(shù)所提函數(shù)的參數(shù)是函數(shù)所提供的數(shù)據(jù)接口,用來實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的數(shù)據(jù)傳供的數(shù)據(jù)接口,用來實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的數(shù)據(jù)傳遞。遞。參數(shù)說明必須給出參數(shù)的名稱、類型,參數(shù)說明必須給出參數(shù)的名稱、類型,允許一個(gè)函數(shù)包含允許一個(gè)函數(shù)包含一到多個(gè)參數(shù),參數(shù)之間用逗號(hào)分隔。一到多個(gè)參數(shù),參數(shù)之間用逗號(hào)分隔。函數(shù)定義中的參數(shù)稱為函數(shù)定義中的參數(shù)稱為“形式參數(shù)形式參數(shù)”;調(diào)用函數(shù)時(shí)所提供的參數(shù)稱為調(diào)用函數(shù)時(shí)所提供的參數(shù)稱為“實(shí)在參數(shù)實(shí)在參數(shù)”。注意:注意:形參只能是變量。形參只能是變量。例如:例如:double max(double x,double y
9、)max帶有兩個(gè)參數(shù)帶有兩個(gè)參數(shù)x和和y,類型都是雙精度型。,類型都是雙精度型。解釋:解釋:n數(shù)據(jù)說明部分?jǐn)?shù)據(jù)說明部分:在函數(shù)體內(nèi),用來說明:在函數(shù)體內(nèi),用來說明在函數(shù)在函數(shù)內(nèi)部有效內(nèi)部有效的數(shù)據(jù)對(duì)象(變量等),如果函數(shù)沒的數(shù)據(jù)對(duì)象(變量等),如果函數(shù)沒有內(nèi)部數(shù)據(jù),則此部分可以省略。有內(nèi)部數(shù)據(jù),則此部分可以省略。在函數(shù)內(nèi)部定義的變量稱為局部變量。在函數(shù)內(nèi)部定義的變量稱為局部變量。局部變量局部變量?jī)H在定義它的函數(shù)內(nèi)部有效,局部變量未僅在定義它的函數(shù)內(nèi)部有效,局部變量未經(jīng)初始化,其值總是不確定的經(jīng)初始化,其值總是不確定的。n執(zhí)行部分:執(zhí)行部分:在函數(shù)體內(nèi),由若干可執(zhí)行語(yǔ)句組在函數(shù)體內(nèi),由若干可執(zhí)行
10、語(yǔ)句組成。該部分不能省略。成。該部分不能省略。n注意:注意:C+不允許函數(shù)定義嵌套,不允許函數(shù)定義嵌套,即:在函數(shù)定義中再定義一個(gè)函數(shù)是非法的。即:在函數(shù)定義中再定義一個(gè)函數(shù)是非法的。2作用作用用來實(shí)現(xiàn)某一特定的功能。用來實(shí)現(xiàn)某一特定的功能。例如:編寫一個(gè)函數(shù)將小寫英文字母轉(zhuǎn)換成大寫例如:編寫一個(gè)函數(shù)將小寫英文字母轉(zhuǎn)換成大寫英文字母。英文字母。char upper(char c) char c1; if (c=a & c=z) c1=c-32; else c1=c; return (c1);5.4函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)的功能是通過函數(shù)調(diào)用實(shí)現(xiàn)的,調(diào)用時(shí)必須提供與函數(shù)的功能是通過函數(shù)調(diào)用實(shí)
11、現(xiàn)的,調(diào)用時(shí)必須提供與函數(shù)定義相對(duì)應(yīng)的各個(gè)參數(shù)的實(shí)際值。函數(shù)定義相對(duì)應(yīng)的各個(gè)參數(shù)的實(shí)際值。1函數(shù)調(diào)用的格式函數(shù)調(diào)用的格式( );說明:說明:函數(shù)是函數(shù)是“按名調(diào)用按名調(diào)用”的的,所以函數(shù)名應(yīng)該準(zhǔn)確無誤。,所以函數(shù)名應(yīng)該準(zhǔn)確無誤。參數(shù)表,給出與函數(shù)定義所描述的形式參數(shù)相對(duì)應(yīng)的各個(gè)實(shí)參數(shù)表,給出與函數(shù)定義所描述的形式參數(shù)相對(duì)應(yīng)的各個(gè)實(shí)在參數(shù)。在參數(shù)。注意:實(shí)參與形參必須類型一致,個(gè)數(shù)相等,順序吻合。注意:實(shí)參與形參必須類型一致,個(gè)數(shù)相等,順序吻合。函數(shù)調(diào)用時(shí)所提供的實(shí)參,可以是常量、變量、表達(dá)式、函函數(shù)調(diào)用時(shí)所提供的實(shí)參,可以是常量、變量、表達(dá)式、函數(shù)調(diào)用等。但其值必須是確定的。數(shù)調(diào)用等。但其值必
12、須是確定的。例如:例例1:sqrt(30) 實(shí)參是常量;實(shí)參是常量;sqrt(a) 實(shí)參是變量;實(shí)參是變量;sqrt(a*100) 實(shí)參是表達(dá)式;實(shí)參是表達(dá)式;sqrt(abs(x) 實(shí)參是另一函數(shù)調(diào)用(求實(shí)參是另一函數(shù)調(diào)用(求x的絕對(duì)值);的絕對(duì)值);例例2:sqrt(pow(sin(x),2.5)/實(shí)參是函數(shù)調(diào)用實(shí)參是函數(shù)調(diào)用說明:說明:sin函數(shù)的函數(shù)原型為:函數(shù)的函數(shù)原型為:double sin(double x); 2函數(shù)調(diào)用可以出現(xiàn)在以下三種場(chǎng)合:函數(shù)調(diào)用可以出現(xiàn)在以下三種場(chǎng)合:(參見(參見P:136) 1)出現(xiàn)在表達(dá)式中:)出現(xiàn)在表達(dá)式中:有返回類型的函數(shù)調(diào)用有返回類型的函數(shù)調(diào)用
13、可以參加表可以參加表達(dá)式運(yùn)算,或直接賦值給對(duì)應(yīng)類型的變量,構(gòu)成表達(dá)達(dá)式運(yùn)算,或直接賦值給對(duì)應(yīng)類型的變量,構(gòu)成表達(dá)式語(yǔ)句。式語(yǔ)句。如:如:2*sqrt(56)2)函數(shù)調(diào)用語(yǔ)句:函數(shù)調(diào)用語(yǔ)句:即函數(shù)調(diào)用獨(dú)立構(gòu)成一條語(yǔ)句。即函數(shù)調(diào)用獨(dú)立構(gòu)成一條語(yǔ)句。例如:例如:print();strcpy(s1,s2);3)作為函數(shù)的參數(shù):函數(shù)調(diào)用的實(shí)參是某一函數(shù)調(diào)用。)作為函數(shù)的參數(shù):函數(shù)調(diào)用的實(shí)參是某一函數(shù)調(diào)用。 如:如:max(a,max(b,c) sqrt(abs(x)3函數(shù)調(diào)用機(jī)制和調(diào)用過程函數(shù)調(diào)用機(jī)制和調(diào)用過程(P:145)1)運(yùn)行時(shí)的內(nèi)存布局運(yùn)行時(shí)的內(nèi)存布局程序要運(yùn)行,就要先將可執(zhí)行程序文件裝載到計(jì)算
14、機(jī)的內(nèi)程序要運(yùn)行,就要先將可執(zhí)行程序文件裝載到計(jì)算機(jī)的內(nèi)存中,其裝載工作由操作系統(tǒng)掌控。存中,其裝載工作由操作系統(tǒng)掌控。一般而言,操作系統(tǒng)將程序裝入內(nèi)存后,將形成一個(gè)隨時(shí)一般而言,操作系統(tǒng)將程序裝入內(nèi)存后,將形成一個(gè)隨時(shí)可以運(yùn)行的進(jìn)程空間,該進(jìn)程空間分四個(gè)區(qū)域:可以運(yùn)行的進(jìn)程空間,該進(jìn)程空間分四個(gè)區(qū)域:(1)代碼區(qū):存放程序的執(zhí)行代碼,即程序中各個(gè)函數(shù)的代碼區(qū):存放程序的執(zhí)行代碼,即程序中各個(gè)函數(shù)的代碼;代碼;(2)全局?jǐn)?shù)據(jù)區(qū):存放程序中的全局?jǐn)?shù)據(jù)區(qū):存放程序中的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù);(3)堆區(qū):存放程序的堆區(qū):存放程序的動(dòng)態(tài)數(shù)據(jù)動(dòng)態(tài)數(shù)據(jù);(4)棧區(qū):存放程序的棧區(qū):存放程序的
15、局部數(shù)據(jù)局部數(shù)據(jù)。3函數(shù)調(diào)用機(jī)制和調(diào)用過程函數(shù)調(diào)用機(jī)制和調(diào)用過程(P:145)2)棧區(qū)棧區(qū)n在在C+中函數(shù)調(diào)用的整個(gè)過程需要中函數(shù)調(diào)用的整個(gè)過程需要“棧?!钡膮⒌膮⑴c。與。n“棧?!笔且环N是一種“先進(jìn)后出先進(jìn)后出”的數(shù)據(jù)結(jié)構(gòu)。的數(shù)據(jù)結(jié)構(gòu)。即:先壓進(jìn)去的數(shù)據(jù)最后彈出。即:先壓進(jìn)去的數(shù)據(jù)最后彈出。nC+在處理函數(shù)調(diào)用時(shí)使用的棧稱為運(yùn)行棧。在處理函數(shù)調(diào)用時(shí)使用的棧稱為運(yùn)行棧。它用來存放返回地址、函數(shù)參數(shù)以及函數(shù)內(nèi)部它用來存放返回地址、函數(shù)參數(shù)以及函數(shù)內(nèi)部定義的數(shù)據(jù)等。定義的數(shù)據(jù)等。運(yùn)行棧隨著程序的運(yùn)行而動(dòng)態(tài)變化。運(yùn)行棧隨著程序的運(yùn)行而動(dòng)態(tài)變化。3函數(shù)調(diào)用機(jī)制和調(diào)用過程函數(shù)調(diào)用機(jī)制和調(diào)用過程(P:14
16、5)3)函數(shù)調(diào)用過程函數(shù)調(diào)用過程每一個(gè)函數(shù)的調(diào)用過程都包括:調(diào)用初始化、執(zhí)行、善每一個(gè)函數(shù)的調(diào)用過程都包括:調(diào)用初始化、執(zhí)行、善后處理三個(gè)階段,具體分為以下步驟:后處理三個(gè)階段,具體分為以下步驟: (1)在運(yùn)行棧的棧頂建立被調(diào)函數(shù)的??臻g;在運(yùn)行棧的棧頂建立被調(diào)函數(shù)的??臻g; (2)保護(hù)主調(diào)函數(shù)的運(yùn)行狀態(tài)和返回地址;保護(hù)主調(diào)函數(shù)的運(yùn)行狀態(tài)和返回地址; (3)傳遞參數(shù);傳遞參數(shù); 初始化階段初始化階段 (4)將運(yùn)行控制權(quán)交給被調(diào)函數(shù);將運(yùn)行控制權(quán)交給被調(diào)函數(shù); (5)執(zhí)行被調(diào)函數(shù);執(zhí)行被調(diào)函數(shù); /執(zhí)行階段執(zhí)行階段 (6)取出返回地址;取出返回地址; (7)恢復(fù)主調(diào)函數(shù)的運(yùn)行狀態(tài);恢復(fù)主調(diào)函數(shù)的
17、運(yùn)行狀態(tài);善后階段善后階段 (8)返回主調(diào)函數(shù)。返回主調(diào)函數(shù)。/例例54( f0503.cpp ) 棧區(qū)運(yùn)動(dòng)的演示程序棧區(qū)運(yùn)動(dòng)的演示程序int funcA(int x, int y);void funcB(int& s);/-int main() int a=6, b=12; a = funcA(a,b); return 1;/-int funcA(int x, int y) int n=5; funcB(n); return n;/-void funcB(int& s) int x=8; s = x;程序的執(zhí)行過程程序的執(zhí)行過程(1)main最先執(zhí)行最后結(jié)束,最先執(zhí)行最后結(jié)束
18、,funcB最后執(zhí)行卻最先結(jié)束;最后執(zhí)行卻最先結(jié)束;(2)每一函數(shù)在調(diào)用另一函數(shù)時(shí)必須暫時(shí)中斷自身的執(zhí)行;每一函數(shù)在調(diào)用另一函數(shù)時(shí)必須暫時(shí)中斷自身的執(zhí)行;(3)每一被調(diào)用的函數(shù)執(zhí)行結(jié)束后,必須能返回主調(diào)函數(shù)調(diào)用處的下一執(zhí)行點(diǎn),每一被調(diào)用的函數(shù)執(zhí)行結(jié)束后,必須能返回主調(diào)函數(shù)調(diào)用處的下一執(zhí)行點(diǎn),也即調(diào)用前必須保留返回地址。也即調(diào)用前必須保留返回地址。函數(shù)調(diào)用過程中的運(yùn)行棧函數(shù)調(diào)用過程中的運(yùn)行棧運(yùn)行棧會(huì)隨著程序的運(yùn)行而動(dòng)態(tài)變化。運(yùn)行棧會(huì)隨著程序的運(yùn)行而動(dòng)態(tài)變化。4.參數(shù)傳遞參數(shù)傳遞參數(shù)傳遞是函數(shù)調(diào)用過程中十分重要的工作。參數(shù)傳遞是函數(shù)調(diào)用過程中十分重要的工作。n所謂參數(shù)傳遞是指實(shí)在參數(shù)與形式參數(shù)之間
19、的所謂參數(shù)傳遞是指實(shí)在參數(shù)與形式參數(shù)之間的數(shù)據(jù)傳遞。數(shù)據(jù)傳遞。(1)傳遞順序:)傳遞順序:按參數(shù)表中參數(shù)的排列順序自左向右逐一傳遞。按參數(shù)表中參數(shù)的排列順序自左向右逐一傳遞。(2)傳遞方式:有三種傳遞方式)傳遞方式:有三種傳遞方式(形實(shí)結(jié)合方式形實(shí)結(jié)合方式)I.傳值傳值II.傳遞指針傳遞指針I(yè)II.傳遞引用傳遞引用I.傳值(傳值(P:137)n傳值:傳值:在函數(shù)被調(diào)用時(shí),將實(shí)參的值存在函數(shù)被調(diào)用時(shí),將實(shí)參的值存入對(duì)應(yīng)形參的參數(shù)區(qū)中。入對(duì)應(yīng)形參的參數(shù)區(qū)中。實(shí)參可以是變量、常量、表達(dá)式。實(shí)參可以是變量、常量、表達(dá)式。n特點(diǎn):被調(diào)函數(shù)對(duì)參數(shù)的修改不會(huì)影響特點(diǎn):被調(diào)函數(shù)對(duì)參數(shù)的修改不會(huì)影響主調(diào)函數(shù)用做
20、實(shí)參的數(shù)據(jù)對(duì)象。主調(diào)函數(shù)用做實(shí)參的數(shù)據(jù)對(duì)象。這樣的參數(shù)傳遞方式,這樣的參數(shù)傳遞方式,只能實(shí)現(xiàn)數(shù)據(jù)的只能實(shí)現(xiàn)數(shù)據(jù)的單向傳遞,單向傳遞,即:無法由實(shí)參帶回函數(shù)對(duì)即:無法由實(shí)參帶回函數(shù)對(duì)參數(shù)的任何修改。參數(shù)的任何修改。例如:例如:/swap_V.cpp#includeusing namespace std;void swap(int, int);int main()int x=5,y=3,z=7;swap(x,y);coutx=x,y=y,z=zendl;swap(y,z);coutx=x,y=y,z=zendl;return 1;void swap(int a,int b)int temp=a;a
21、=b;b=temp;輸出結(jié)果:輸出結(jié)果:x=5,y=3,z=7x=5,y=3,z=7II.傳遞指針:即指針作為函數(shù)的參數(shù)傳遞指針:即指針作為函數(shù)的參數(shù)(例如:例如:/swap_P.cpp)#include using namespace std;void swap(int *,int *);int main()int a=3,b=8;couta=a,b=bendl;swap(&a,&b); /必須以變量必須以變量a a和和b b的地址作為實(shí)參的地址作為實(shí)參coutafter swapping.n;couta=a,b=bendl;return 1;void swap(int *x
22、,int *y)int temp=*x; /必須用必須用“ “ * *指針變量名指針變量名”的形式操作目標(biāo)數(shù)據(jù)的形式操作目標(biāo)數(shù)據(jù)*x=*y;*y=temp;運(yùn)行結(jié)果:運(yùn)行結(jié)果:a=3,b=8after swapping a=8,b=3從這個(gè)例子中我們可以看出:從這個(gè)例子中我們可以看出:在程序設(shè)計(jì)中通過定義在程序設(shè)計(jì)中通過定義函數(shù)的參數(shù)是指針類型數(shù)據(jù)函數(shù)的參數(shù)是指針類型數(shù)據(jù)可以使函數(shù)返回不止一個(gè)的值??梢允购瘮?shù)返回不止一個(gè)的值。III.傳遞引用傳遞引用(即:即:引用作為函數(shù)的參數(shù)引用作為函數(shù)的參數(shù))n一個(gè)函數(shù)的參數(shù)也可定義成引用的形式。一個(gè)函數(shù)的參數(shù)也可定義成引用的形式。n引用形參:引用形參:在
23、函數(shù)定義的參數(shù)表中,參數(shù)名前加在函數(shù)定義的參數(shù)表中,參數(shù)名前加上上 &(引用運(yùn)算符)(引用運(yùn)算符) 的參數(shù)即為引用形參。的參數(shù)即為引用形參。例如:例如:void swap(int &x,int &y)/函數(shù)的形參函數(shù)的形參x, yx, y都是引用都是引用int temp=x;x=y;y=temp;此時(shí),此時(shí),函數(shù)的原型函數(shù)的原型可寫為:可寫為:void swap(int&, int&);引用作為函數(shù)參數(shù)的函數(shù)調(diào)用引用作為函數(shù)參數(shù)的函數(shù)調(diào)用n在程序中調(diào)用函數(shù)時(shí),在程序中調(diào)用函數(shù)時(shí),相應(yīng)主調(diào)函數(shù)的調(diào)用點(diǎn)處,相應(yīng)主調(diào)函數(shù)的調(diào)用點(diǎn)處,直接以變量作為實(shí)參進(jìn)行調(diào)用即
24、可直接以變量作為實(shí)參進(jìn)行調(diào)用即可。如:對(duì)應(yīng)上面定義的如:對(duì)應(yīng)上面定義的swapswap函數(shù),相應(yīng)的主調(diào)函數(shù)可寫為:函數(shù),相應(yīng)的主調(diào)函數(shù)可寫為:intint main() main() intint a=3,b=8; a=3,b=8;couta=a,b=bendlcouta=a,b=bendl; ;swap(a,b);swap(a,b);/直接以變量直接以變量a a和和b b作為實(shí)參調(diào)用作為實(shí)參調(diào)用swapswap函數(shù)函數(shù) coutcoutafter swapping.n;after swapping.n;couta=a,b=bendlcouta=a,b=bendl; ;return 1;ret
25、urn 1; /swap_R.cpp/swap_R.cpp運(yùn)行結(jié)果:運(yùn)行結(jié)果:a=3,b=8after swapping a=8,b=3幾點(diǎn)說明幾點(diǎn)說明(1)用引用作為函數(shù)的參數(shù)可使函數(shù)返回多個(gè)值。)用引用作為函數(shù)的參數(shù)可使函數(shù)返回多個(gè)值。(2 2)傳遞引用給函數(shù)與傳遞指針的效果是一樣的傳遞引用給函數(shù)與傳遞指針的效果是一樣的。這時(shí),被調(diào)函數(shù)的形參就作為原來主調(diào)函數(shù)中的這時(shí),被調(diào)函數(shù)的形參就作為原來主調(diào)函數(shù)中的實(shí)參變量或?qū)ο蟮囊粋€(gè)別名來使用,所以,實(shí)參變量或?qū)ο蟮囊粋€(gè)別名來使用,所以,在被在被調(diào)函數(shù)中對(duì)形參變量的操作就是對(duì)其相應(yīng)的主調(diào)調(diào)函數(shù)中對(duì)形參變量的操作就是對(duì)其相應(yīng)的主調(diào)函數(shù)中的目標(biāo)對(duì)象的操
26、作。函數(shù)中的目標(biāo)對(duì)象的操作。使用指針作為函數(shù)參數(shù)使用指針作為函數(shù)參數(shù)的不同之處:的不同之處:在被調(diào)函數(shù)中需要重復(fù)使用在被調(diào)函數(shù)中需要重復(fù)使用“* *指針變量名指針變量名” ” 的形式進(jìn)行的形式進(jìn)行運(yùn)算運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。(3 3)使用引用傳遞函數(shù)的參數(shù)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒有產(chǎn)生實(shí)在內(nèi)存中并沒有產(chǎn)生實(shí)參的副本,參的副本,是直接對(duì)實(shí)參操作是直接對(duì)實(shí)參操作;使用一般變量傳遞函數(shù)的參數(shù)使用一般變量傳遞函數(shù)的參數(shù),需要給形參分配存儲(chǔ),
27、需要給形參分配存儲(chǔ)單元,單元,形參與實(shí)參就占用不同的存儲(chǔ)單元形參與實(shí)參就占用不同的存儲(chǔ)單元,所以,形,所以,形參變量的值是實(shí)參變量的副本。參變量的值是實(shí)參變量的副本。因此,因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)量較大時(shí),用引用比用一般變當(dāng)參數(shù)傳遞的數(shù)據(jù)量較大時(shí),用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。量傳遞參數(shù)的效率和所占空間都好。n用引用作為函數(shù)的參數(shù)的優(yōu)點(diǎn):用引用作為函數(shù)的參數(shù)的優(yōu)點(diǎn):引用具有指針的威力,但是,調(diào)用引用傳遞的函數(shù)時(shí),引用具有指針的威力,但是,調(diào)用引用傳遞的函數(shù)時(shí),可讀性卻比指針傳遞好;引用具有傳值方式函數(shù)調(diào)用可讀性卻比指針傳遞好;引用具有傳值方式函數(shù)調(diào)用語(yǔ)法的簡(jiǎn)單性與可讀性,但是,
28、威力卻比傳值方式強(qiáng)。語(yǔ)法的簡(jiǎn)單性與可讀性,但是,威力卻比傳值方式強(qiáng)。n程序需要從函數(shù)返回兩個(gè)或兩個(gè)以上的值,程序需要從函數(shù)返回兩個(gè)或兩個(gè)以上的值,解決的辦法:解決的辦法:1)用引用作為函數(shù)的參數(shù)用引用作為函數(shù)的參數(shù)2)用指針作為函數(shù)的參數(shù)用指針作為函數(shù)的參數(shù)n函數(shù)參數(shù)傳遞指針和引用是一把雙刃劍,它函數(shù)參數(shù)傳遞指針和引用是一把雙刃劍,它的負(fù)面作用是破壞非本地?cái)?shù)據(jù),破壞模塊性。的負(fù)面作用是破壞非本地?cái)?shù)據(jù),破壞模塊性。為避免這一副作用,在程序設(shè)計(jì)中可根據(jù)需為避免這一副作用,在程序設(shè)計(jì)中可根據(jù)需要在指針和引用參數(shù)前加要在指針和引用參數(shù)前加const修飾符,以修飾符,以此限制函數(shù)體對(duì)參數(shù)的寫操作。此限制
29、函數(shù)體對(duì)參數(shù)的寫操作。例如例如: (P:141)例例5-2(自學(xué)不講)/ f0501.cpp 向量參數(shù)傳遞向量參數(shù)傳遞#include#include#include#includeusing namespace std;typedef vector VI;typedef vector VVI;void print(const VI&);void input(VVI&);bool findVec(const VVI&, VI&);int main() VVI matrix; input(matrix); VI vec; if(findVec(matrix, ve
30、c) print(vec); return 1;void print(const VI& v) for(int i=0; iv.size(); +i) coutvi ; coutn; m.resize(n); for(string s; n- & getline(in, s); ) for(istringstream sin(s); sint; mm.size()-n-1.push_back(t); bool findVec(const VVI& matrix, VI& v) for(int i=0; imatrix.size(); +i) for(int j=
31、0; j0)從以上表達(dá)式可以看到:從以上表達(dá)式可以看到:(1)當(dāng)當(dāng)n0時(shí),時(shí), n!=n*(n-1)!,求求 n! 的問題就轉(zhuǎn)化成了求的問題就轉(zhuǎn)化成了求n*(n-1)! 的問題,而的問題,而求求(n-1)! 的問題與求的問題與求n! 的解法相同,只是求的解法相同,只是求階乘的對(duì)象的值減去階乘的對(duì)象的值減去1。(2)當(dāng)當(dāng)n的值遞減至的值遞減至0時(shí),時(shí),n!=1從而使遞歸得以從而使遞歸得以結(jié)束。結(jié)束。按照以上分析,求按照以上分析,求n!可以用遞歸的方法解決??梢杂眠f歸的方法解決。/ 用遞歸調(diào)用的方法計(jì)算用遞歸調(diào)用的方法計(jì)算n! #include using namespace std;long f
32、act(int);int main() long result; int n; cout n; if (n=0) result=fact(n); cout endl n!= result endl; else cout endl 輸入的數(shù)據(jù)不正確輸入的數(shù)據(jù)不正確! endl; return 1;例(續(xù))long fact(int n)if (n=0)/先測(cè)試,后遞歸調(diào)用先測(cè)試,后遞歸調(diào)用 return(1);else return(fact(n-1)*n);fact函數(shù)的執(zhí)行部分,出現(xiàn)自身的直接調(diào)用函數(shù)的執(zhí)行部分,出現(xiàn)自身的直接調(diào)用直接遞歸調(diào)用。直接遞歸調(diào)用。調(diào)用過程中,提供給調(diào)用過程中,提供
33、給fact的實(shí)參按:的實(shí)參按:n,n-1,n-2,1,0規(guī)律遞減;規(guī)律遞減;調(diào)用的返回值卻按:調(diào)用的返回值卻按:1,1,2*1,3*2*1,(n)*(n-1)*1的規(guī)律變化。的規(guī)律變化。注意:注意:被調(diào)用函數(shù)運(yùn)行的棧空間獨(dú)立于調(diào)用函數(shù)的??臻g,所以被調(diào)用函數(shù)運(yùn)行的??臻g獨(dú)立于調(diào)用函數(shù)的??臻g,所以與調(diào)用函數(shù)之間的數(shù)據(jù)是無關(guān)的。函數(shù)之間靠參數(shù)傳遞和與調(diào)用函數(shù)之間的數(shù)據(jù)是無關(guān)的。函數(shù)之間靠參數(shù)傳遞和返回值來聯(lián)系,函數(shù)看作為黑盒。返回值來聯(lián)系,函數(shù)看作為黑盒。(參見參見P:163 圖圖5-9)4遞歸的評(píng)價(jià)遞歸的評(píng)價(jià)遞歸的目的:遞歸的目的:是簡(jiǎn)化程序設(shè)計(jì)、增強(qiáng)程序的易讀性。是簡(jiǎn)化程序設(shè)計(jì)、增強(qiáng)程序的易
34、讀性。但是,函數(shù)的遞歸調(diào)用明顯會(huì)增加系統(tǒng)開銷。包括但是,函數(shù)的遞歸調(diào)用明顯會(huì)增加系統(tǒng)開銷。包括系統(tǒng)空間的開銷和運(yùn)行時(shí)間的開銷:系統(tǒng)空間的開銷和運(yùn)行時(shí)間的開銷:n時(shí)間上,執(zhí)行調(diào)用與返回的額外工作要占用時(shí)間上,執(zhí)行調(diào)用與返回的額外工作要占用CPU時(shí)間;時(shí)間;n空間上,隨著程序的執(zhí)行每遞歸一次,棧內(nèi)存就空間上,隨著程序的執(zhí)行每遞歸一次,棧內(nèi)存就多占用一段空間。多占用一段空間。n在非常講究程序執(zhí)行效率的場(chǎng)合,應(yīng)盡量減少使在非常講究程序執(zhí)行效率的場(chǎng)合,應(yīng)盡量減少使用遞歸編程技術(shù);相反,在強(qiáng)調(diào)程序結(jié)構(gòu),程序用遞歸編程技術(shù);相反,在強(qiáng)調(diào)程序結(jié)構(gòu),程序的易讀性和可維護(hù)性的場(chǎng)合,卻鼓勵(lì)使用遞歸程的易讀性和可維護(hù)
35、性的場(chǎng)合,卻鼓勵(lì)使用遞歸程序設(shè)計(jì)技術(shù)。序設(shè)計(jì)技術(shù)。5.消去遞歸消去遞歸(P:164)大多數(shù)遞歸函數(shù)都能用非遞歸函數(shù)來代替。大多數(shù)遞歸函數(shù)都能用非遞歸函數(shù)來代替。例如:編寫一函數(shù)用于求例如:編寫一函數(shù)用于求n!n!。long jcn(intlong jcn(int n) n)/非遞歸方法非遞歸方法 intint i; i;long jclong jc=1;=1;for (i=1;i=n;i+)for (i=1;i=n;i+)jcjc* *=i;=i;return jcreturn jc; ; . 遞歸函數(shù)的應(yīng)用遞歸函數(shù)的應(yīng)用例如:編寫一個(gè)含有遞歸調(diào)用的程序處理例如:編寫一個(gè)含有遞歸調(diào)用的程序處理
36、hanoi(漢諾)塔問題。(課外練習(xí))(漢諾)塔問題。(課外練習(xí)) hanoi(漢諾)塔問題描述為:(漢諾)塔問題描述為:有三根針有三根針A,B,C。A針上有針上有N個(gè)盤子,盤子大個(gè)盤子,盤子大小不等,大的在下,小的在上。要求將小不等,大的在下,小的在上。要求將N個(gè)盤個(gè)盤子從子從A針移到針移到C針,在移動(dòng)過程中可以借助針,在移動(dòng)過程中可以借助B針,針,但每次只允許移動(dòng)一個(gè)盤子,并且在移動(dòng)過程但每次只允許移動(dòng)一個(gè)盤子,并且在移動(dòng)過程中在三根針上都保持大盤在下,小盤在上。中在三根針上都保持大盤在下,小盤在上。5.6函數(shù)重載函數(shù)重載(P:165) 1什么叫重載什么叫重載n對(duì)于在不同的類型上作不同的運(yùn)
37、算而又用同樣對(duì)于在不同的類型上作不同的運(yùn)算而又用同樣的符號(hào)或名字的情況,稱之為的符號(hào)或名字的情況,稱之為重載重載。例如:例如:“+”運(yùn)算符可以用來進(jìn)行整數(shù)、浮點(diǎn)數(shù)甚至指運(yùn)算符可以用來進(jìn)行整數(shù)、浮點(diǎn)數(shù)甚至指針數(shù)據(jù)的加法運(yùn)算;針數(shù)據(jù)的加法運(yùn)算;cin、cout這兩個(gè)預(yù)定義的流類對(duì)象也能適應(yīng)不這兩個(gè)預(yù)定義的流類對(duì)象也能適應(yīng)不同數(shù)據(jù)類型的輸入輸出。同數(shù)據(jù)類型的輸入輸出。2什么叫函數(shù)重載什么叫函數(shù)重載n函數(shù)重載:多個(gè)功能相同,但函數(shù)重載:多個(gè)功能相同,但參數(shù)類型或參數(shù)參數(shù)類型或參數(shù)個(gè)數(shù)不同個(gè)數(shù)不同的函數(shù)使用同一個(gè)函數(shù)名,稱為的函數(shù)使用同一個(gè)函數(shù)名,稱為函數(shù)函數(shù)重載重載。例如:對(duì)數(shù)值數(shù)據(jù)求絕對(duì)值,如果考慮
38、整型和雙精度型例如:對(duì)數(shù)值數(shù)據(jù)求絕對(duì)值,如果考慮整型和雙精度型兩種不同類型的數(shù)據(jù)。則應(yīng)該有兩個(gè)求絕對(duì)值函數(shù):兩種不同類型的數(shù)據(jù)。則應(yīng)該有兩個(gè)求絕對(duì)值函數(shù):int abs(int);/求整型數(shù)的絕對(duì)值求整型數(shù)的絕對(duì)值double dabs(double);/求雙精度型數(shù)的絕對(duì)值求雙精度型數(shù)的絕對(duì)值由于兩個(gè)函數(shù)都是求絕對(duì)值的,如果采用同一個(gè)函數(shù)名,由于兩個(gè)函數(shù)都是求絕對(duì)值的,如果采用同一個(gè)函數(shù)名,即表示成函數(shù)重載,則更符合人們的習(xí)慣。也將給使即表示成函數(shù)重載,則更符合人們的習(xí)慣。也將給使用者帶來極大的方便,便于使用,也便于記憶。用者帶來極大的方便,便于使用,也便于記憶。如:如:int abs(in
39、t);double abs(double);3.重載函數(shù)的調(diào)用重載函數(shù)的調(diào)用n在調(diào)用重載函數(shù)時(shí),編譯器將根據(jù)實(shí)參和形參在調(diào)用重載函數(shù)時(shí),編譯器將根據(jù)實(shí)參和形參的類型及個(gè)數(shù)的的類型及個(gè)數(shù)的最佳匹配最佳匹配,自動(dòng)確定調(diào)用哪一,自動(dòng)確定調(diào)用哪一個(gè)函數(shù)。個(gè)函數(shù)。abs(-9) int abs(int);abs(-100.9) double abs(double);注:實(shí)際上注:實(shí)際上abs是一個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),對(duì)應(yīng)的頭文是一個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),對(duì)應(yīng)的頭文件是件是math.h。4.注意:注意:(1)不要將不同功能的函數(shù)定義為重載函數(shù)不要將不同功能的函數(shù)定義為重載函數(shù),以免出現(xiàn)誤解、混淆。以免出現(xiàn)誤解、混淆。(2)
40、實(shí)現(xiàn)函數(shù)的重載必須滿足下列條件之一:實(shí)現(xiàn)函數(shù)的重載必須滿足下列條件之一: 參數(shù)表中對(duì)應(yīng)的參數(shù)類型不同;參數(shù)表中對(duì)應(yīng)的參數(shù)類型不同; 參數(shù)表中參數(shù)個(gè)數(shù)不同;參數(shù)表中參數(shù)個(gè)數(shù)不同; 參數(shù)表中不同類型參數(shù)的次序不同。參數(shù)表中不同類型參數(shù)的次序不同。幾點(diǎn)說明:幾點(diǎn)說明:1)返回類型返回類型不能不能區(qū)分函數(shù);區(qū)分函數(shù); 例如:例如:float add(int ,float);int add(int,float); 在調(diào)用時(shí)系統(tǒng)無法區(qū)分選擇對(duì)應(yīng)的函數(shù)。在調(diào)用時(shí)系統(tǒng)無法區(qū)分選擇對(duì)應(yīng)的函數(shù)。2)采用引用參數(shù)采用引用參數(shù)不能不能區(qū)分函數(shù);區(qū)分函數(shù); 例如:例如:void print(double); void
41、print(double &);3)不能不能用用typedef定義的類型名來區(qū)分重載函數(shù)定義的類型名來區(qū)分重載函數(shù)聲明中的參數(shù)。聲明中的參數(shù)。例如:例如:typedef int INT; void func(int); void func(INT);4)有些派生基本類型的參數(shù)雖然可以區(qū)分有些派生基本類型的參數(shù)雖然可以區(qū)分同名函數(shù),但在使用中必須注意;同名函數(shù),但在使用中必須注意;例如:例如:int abs(int); unsigned int abs(unsigned int);調(diào)用:調(diào)用:abs(3)因?yàn)閷?shí)參因?yàn)閷?shí)參3 既可以與既可以與int型形參匹配,也可型形參匹配,也可以與以與
42、unsigend int 型形參匹配,故這型形參匹配,故這里可能出現(xiàn)二義性。里可能出現(xiàn)二義性。5.7默認(rèn)參數(shù)的函數(shù)默認(rèn)參數(shù)的函數(shù)通常,在調(diào)用函數(shù)時(shí),要為函數(shù)的每個(gè)形式參數(shù)通常,在調(diào)用函數(shù)時(shí),要為函數(shù)的每個(gè)形式參數(shù)指定對(duì)應(yīng)的實(shí)在參數(shù)。指定對(duì)應(yīng)的實(shí)在參數(shù)。例如:例如: void delay(int a); /函數(shù)聲明函數(shù)聲明void delay(int a) / 函數(shù)定義函數(shù)定義 int sum=0; for(int i=1; i=a; +i)for(int j=1; j1000; +j)for(int k=1; k100000; +k) sum+; /這是一個(gè)產(chǎn)生時(shí)延的函數(shù)這是一個(gè)產(chǎn)生時(shí)延的函數(shù)
43、調(diào)用:調(diào)用:delay(2); /與與a對(duì)應(yīng)的實(shí)參為對(duì)應(yīng)的實(shí)參為21. 默認(rèn)參數(shù)的聲明默認(rèn)參數(shù)的聲明nC+可以可以給函數(shù)聲明中的參數(shù)指定默認(rèn)參數(shù)給函數(shù)聲明中的參數(shù)指定默認(rèn)參數(shù)值。值。這樣,在函數(shù)調(diào)用時(shí),對(duì)應(yīng)的實(shí)參就可以這樣,在函數(shù)調(diào)用時(shí),對(duì)應(yīng)的實(shí)參就可以省略。省略。例如:例如:如果將如果將delay()函數(shù)中的參數(shù)函數(shù)中的參數(shù)a定義成默認(rèn)值為定義成默認(rèn)值為2,只需,只需簡(jiǎn)單地把簡(jiǎn)單地把函數(shù)聲明函數(shù)聲明改為:改為:void delay(int a=2);/函數(shù)聲明函數(shù)聲明調(diào)用:調(diào)用:delay();/a 采用默認(rèn)值采用默認(rèn)值2delay(5);/a 設(shè)置為設(shè)置為5由此可見,這種形式的函數(shù)在調(diào)用時(shí)
44、具有靈活性。由此可見,這種形式的函數(shù)在調(diào)用時(shí)具有靈活性。注意:當(dāng)既有聲明又有定義時(shí),默認(rèn)參數(shù)值只能注意:當(dāng)既有聲明又有定義時(shí),默認(rèn)參數(shù)值只能置于聲明中。置于聲明中。2. 默認(rèn)參數(shù)的順序規(guī)定默認(rèn)參數(shù)的順序規(guī)定n如果一個(gè)函數(shù)中有多個(gè)默認(rèn)參數(shù),則如果一個(gè)函數(shù)中有多個(gè)默認(rèn)參數(shù),則在形式參在形式參數(shù)分布中,默認(rèn)參數(shù)應(yīng)從右至左逐個(gè)定義。數(shù)分布中,默認(rèn)參數(shù)應(yīng)從右至左逐個(gè)定義。即:即:函數(shù)參數(shù)默認(rèn)值只能從后往前設(shè)置。函數(shù)參數(shù)默認(rèn)值只能從后往前設(shè)置。例如:例如:void func(int a=1, int b, int c=3, int d=4); /error!void func(int a, int b=2
45、, int c=3, int d=4); /right! 對(duì)于第二個(gè)函數(shù)聲明,其調(diào)用:對(duì)于第二個(gè)函數(shù)聲明,其調(diào)用:func(10,15,20,30);/調(diào)用時(shí)給出所有實(shí)參調(diào)用時(shí)給出所有實(shí)參 正確!正確!func(12,12);/參數(shù)參數(shù)c和和d默認(rèn)默認(rèn)func();/參數(shù)參數(shù)a沒有默認(rèn)值沒有默認(rèn)值 錯(cuò)誤!錯(cuò)誤!func(2,15,20);/只能從右到左順序匹配默認(rèn)只能從右到左順序匹配默認(rèn)3. 默認(rèn)參數(shù)與函數(shù)重載默認(rèn)參數(shù)與函數(shù)重載n默認(rèn)參數(shù)可將一系列簡(jiǎn)單的重載函數(shù)合成為一個(gè)。默認(rèn)參數(shù)可將一系列簡(jiǎn)單的重載函數(shù)合成為一個(gè)。在程序設(shè)計(jì)中,如果幾個(gè)重載函數(shù)做基本相同的事,只不在程序設(shè)計(jì)中,如果幾個(gè)重載函
46、數(shù)做基本相同的事,只不過參數(shù)個(gè)數(shù)不同而已,可用過參數(shù)個(gè)數(shù)不同而已,可用默認(rèn)參數(shù)值的方法默認(rèn)參數(shù)值的方法將一系列將一系列簡(jiǎn)單的重載函數(shù)合成為一個(gè)帶簡(jiǎn)單的重載函數(shù)合成為一個(gè)帶默認(rèn)參數(shù)值的函數(shù)默認(rèn)參數(shù)值的函數(shù)例如:例如:void point(int,int) / void point(int a) return point(a,4); void point() return point(3,4); 可用下面的默認(rèn)參數(shù)的函數(shù)來替代:可用下面的默認(rèn)參數(shù)的函數(shù)來替代:void point(int a=3,int b=4);如果一組重載函數(shù)(可能帶有默認(rèn)參數(shù))都允許如果一組重載函數(shù)(可能帶有默認(rèn)參數(shù))都允許
47、相同實(shí)參個(gè)數(shù)的調(diào)用,將會(huì)引起調(diào)用的二義性。相同實(shí)參個(gè)數(shù)的調(diào)用,將會(huì)引起調(diào)用的二義性。例如:例如:void func(int);void func(int,int b=4);調(diào)用:調(diào)用:func(7);/錯(cuò)誤!錯(cuò)誤!func(20,30);5.8main函數(shù)參數(shù)函數(shù)參數(shù)(P:157)程序運(yùn)行是在操作系統(tǒng)環(huán)境下進(jìn)行的。程序運(yùn)行是在操作系統(tǒng)環(huán)境下進(jìn)行的。操作系統(tǒng)對(duì)所啟動(dòng)的程序也提供一些服務(wù):操作系統(tǒng)對(duì)所啟動(dòng)的程序也提供一些服務(wù):n接受程序啟動(dòng)時(shí)的臨時(shí)輸入接受程序啟動(dòng)時(shí)的臨時(shí)輸入/輸出重定向請(qǐng)求;輸出重定向請(qǐng)求;n把用戶的請(qǐng)求通過參數(shù)傳遞給程序,讓程序來把用戶的請(qǐng)求通過參數(shù)傳遞給程序,讓程序來處理運(yùn)行
48、要求。處理運(yùn)行要求。5.8.1命令行重定向命令行重定向n命令行重定向的命令行重定向的好處好處:可以在運(yùn)行的當(dāng)場(chǎng)臨時(shí):可以在運(yùn)行的當(dāng)場(chǎng)臨時(shí)決定輸入和輸出的設(shè)備。決定輸入和輸出的設(shè)備。n重定向?qū)崿F(xiàn)的重定向?qū)崿F(xiàn)的前提前提:命令行:命令行即:從即:從“命令提示符命令提示符”窗口輸入命令。窗口輸入命令。n重定向的重定向的實(shí)現(xiàn)方法實(shí)現(xiàn)方法:如果不專門指定設(shè)備,就是標(biāo)準(zhǔn)輸入如果不專門指定設(shè)備,就是標(biāo)準(zhǔn)輸入/輸出;輸出;“”后面規(guī)定輸出設(shè)備;后面規(guī)定輸出設(shè)備;將將“”改為改為“”讓輸出結(jié)果追加到文件中讓輸出結(jié)果追加到文件中去。去。例如:/ f0509.cpp 重定向輸入輸出重定向輸入輸出#includeusi
49、ng namespace std;int main() for(int a,b; cinab; couta+bf0509f0509xyz.txtE:f0509xyz.txt假設(shè):存放數(shù)據(jù)的文件假設(shè):存放數(shù)據(jù)的文件abc.txt已經(jīng)存在。已經(jīng)存在。5.8.25.8.2使用使用mainmain參數(shù)參數(shù)nmain函數(shù)的參數(shù)結(jié)構(gòu)為:函數(shù)的參數(shù)結(jié)構(gòu)為:int main(int argc,char* argv) 說明:說明:1.兩個(gè)形參名一般是采用習(xí)慣名稱兩個(gè)形參名一般是采用習(xí)慣名稱argc和和argv,表示,表示argument count和和argument vector。2.argc表示傳遞的表示傳
50、遞的C串有幾個(gè);串有幾個(gè);argv表示具體的表示具體的C串?dāng)?shù)組,該數(shù)組最后一項(xiàng)是空串。串?dāng)?shù)組,該數(shù)組最后一項(xiàng)是空串。3.char*:C串的類型為串的類型為char*,參數(shù)是以指向,參數(shù)是以指向C串串的指針為元素的數(shù)組,因而描述為的指針為元素的數(shù)組,因而描述為char* 。在在main參數(shù)表達(dá)中,要么不聲明參數(shù),要么按這里的參數(shù)表達(dá)中,要么不聲明參數(shù),要么按這里的參數(shù)格式聲明。參數(shù)格式聲明。只有在定義只有在定義main函數(shù)時(shí)寫出了參數(shù)項(xiàng),在運(yùn)行時(shí)才會(huì)函數(shù)時(shí)寫出了參數(shù)項(xiàng),在運(yùn)行時(shí)才會(huì)接受操作系統(tǒng)的參數(shù)傳遞。接受操作系統(tǒng)的參數(shù)傳遞。/ f0511.cpp 打開以打開以main參數(shù)為名字的文件參數(shù)為名
51、字的文件#include#includeusing namespace std;int main(int argc, char* argv) if(argc!=3) coutUsage: f0511 infile outfilen; return 0; else ifstream in(argv1); ofstream out(argv2); if(in & out) outf0511Usage:f0511 infile outfileE:f0511 abc11.txt xyz11.txt5.9指針與函數(shù)指針與函數(shù)1. 傳遞數(shù)組的指針性質(zhì)傳遞數(shù)組的指針性質(zhì)(P:139)無論何時(shí),將數(shù)組
52、作為參數(shù)傳給函數(shù),實(shí)無論何時(shí),將數(shù)組作為參數(shù)傳給函數(shù),實(shí)際上只是把數(shù)組的地址傳給函數(shù)。際上只是把數(shù)組的地址傳給函數(shù)。一旦把數(shù)組作為參數(shù)傳遞到函數(shù)中,則在一旦把數(shù)組作為參數(shù)傳遞到函數(shù)中,則在棧上定義了指針,可以對(duì)該指針進(jìn)行遞棧上定義了指針,可以對(duì)該指針進(jìn)行遞增、遞減操作。增、遞減操作。例如:例如:arr_point.cpp#include using namespace std;void Sum(int ,int );int main()int a10=1,2,3,4,5,6,7,8,9,10;Sum(a,10);return 1;void Sum(int array,int n)int sum
53、=0;for(int i=0;in;i+)sum+=*array;array+;/是一個(gè)指針,可以作為左值是一個(gè)指針,可以作為左值coutsumendl;等價(jià)于:等價(jià)于:void Sum(int *,int );void Sum(int *array,int n)注意:注意:由于形參由于形參array是指針變量而不是數(shù)組,所以是指針變量而不是數(shù)組,所以不能不能用用sizeof(array)/sizeof(*array)來求取數(shù)組元素的個(gè)數(shù)。來求取數(shù)組元素的個(gè)數(shù)。2. 使用指針修改函數(shù)參數(shù)使用指針修改函數(shù)參數(shù)在程序設(shè)計(jì)中通過定義在程序設(shè)計(jì)中通過定義函數(shù)的參數(shù)是指針類型數(shù)據(jù)可以函數(shù)的參數(shù)是指針類型
54、數(shù)據(jù)可以使函數(shù)返回不止一個(gè)的值。使函數(shù)返回不止一個(gè)的值。#include using namespace std;void swap(int *,int *);int main()int a=3,b=8;couta=a,b=bendl;swap(&a,&b);coutafter swapping.n;couta=a,b=bendl;return 1;void swap(int *x,int *y)int temp=*x;*x=*y;*y=temp;運(yùn)行結(jié)果:運(yùn)行結(jié)果:a=3,b=8after swapping a=8,b=33. 指針函數(shù)指針函數(shù)n返回指針的函數(shù)稱為返回指針的函
55、數(shù)稱為指針函數(shù)指針函數(shù)。n指針函數(shù)的定義形式:指針函數(shù)的定義形式:類型標(biāo)識(shí)符類型標(biāo)識(shí)符 * 函數(shù)名函數(shù)名()例如:例如:point_func.cpp定義定義findmax()函數(shù),其功能是尋找數(shù)組中的最函數(shù),其功能是尋找數(shù)組中的最大元素,將該元素的下標(biāo)通過參數(shù)返回,并返大元素,將該元素的下標(biāo)通過參數(shù)返回,并返回其地址值,編程實(shí)現(xiàn)回其地址值,編程實(shí)現(xiàn)findmax()函數(shù)。函數(shù)。int* findmax(int* array, int size, int* index);#include using namespace std;int* findmax(int* array, int size,
56、 int* index);int main() int a10=33,91,54,67,82,37,85,63,19,68; int* maxaddr; int idx; maxaddr=findmax(a, sizeof(a)/sizeof(*a), &idx); cout the index of maximum element is idx endl the address of it is maxaddr endl the value of it is aidx endl; return 1;int* findmax(int* array, int size, int* ind
57、ex) *index=0; for(int i=0; iarray*index) *index=i; return &array*index;4. 函數(shù)指針函數(shù)指針(P:150)n在程序運(yùn)行中,全局變量存放在全局?jǐn)?shù)據(jù)區(qū)在程序運(yùn)行中,全局變量存放在全局?jǐn)?shù)據(jù)區(qū)(data area),局部變量存放在棧區(qū),局部變量存放在棧區(qū)(stack area),動(dòng)態(tài)變量存放在堆區(qū),動(dòng)態(tài)變量存放在堆區(qū)(heap area)。函數(shù)則存放在代碼區(qū)函數(shù)則存放在代碼區(qū)(code area)。n函數(shù)和變量有兩點(diǎn)相通之處函數(shù)和變量有兩點(diǎn)相通之處:(1)有類型(返回類型),有類型(返回類型),(2)有地址,稱為入口地址。
58、函數(shù)的地址也可作有地址,稱為入口地址。函數(shù)的地址也可作為指針的值,這就是函數(shù)指針。為指針的值,這就是函數(shù)指針。n指向函數(shù)入口地址的指針稱為函數(shù)指針。指向函數(shù)入口地址的指針稱為函數(shù)指針。通過函數(shù)指針可以調(diào)用相應(yīng)的函數(shù)。通過函數(shù)指針可以調(diào)用相應(yīng)的函數(shù)。(1)定義函數(shù)指針)定義函數(shù)指針定義一個(gè)函數(shù)指針要說明函數(shù)的返回值類型、函定義一個(gè)函數(shù)指針要說明函數(shù)的返回值類型、函數(shù)參數(shù)列表。數(shù)參數(shù)列表。n一般語(yǔ)法如下:一般語(yǔ)法如下:數(shù)據(jù)類型(數(shù)據(jù)類型(*函數(shù)指針名)(形參表)函數(shù)指針名)(形參表)n說明:說明:1)數(shù)據(jù)類型指明函數(shù)指針?biāo)负瘮?shù)的返回值類型;數(shù)據(jù)類型指明函數(shù)指針?biāo)负瘮?shù)的返回值類型;2)第一個(gè)圓括
59、號(hào)中的內(nèi)容指明一個(gè)函數(shù)指針的名稱;第一個(gè)圓括號(hào)中的內(nèi)容指明一個(gè)函數(shù)指針的名稱;3)形參表則列出了該指針?biāo)负瘮?shù)的形參類型和個(gè)數(shù)。形參表則列出了該指針?biāo)负瘮?shù)的形參類型和個(gè)數(shù)。例如:例如:int (*func)(chara,char b);區(qū)別區(qū)別int *func(char a,char b);注意:注意:函數(shù)指針與指針函數(shù)的區(qū)別函數(shù)指針與指針函數(shù)的區(qū)別(2)對(duì)函數(shù)指針賦值)對(duì)函數(shù)指針賦值n函數(shù)指針在使用之前也要進(jìn)行賦值,使指針指函數(shù)指針在使用之前也要進(jìn)行賦值,使指針指向一個(gè)已經(jīng)存在的函數(shù)代碼的起始地址。向一個(gè)已經(jīng)存在的函數(shù)代碼的起始地址。n一般語(yǔ)法如下:一般語(yǔ)法如下:函數(shù)指針名函數(shù)名;函數(shù)指
60、針名函數(shù)名;n注意:注意: (1) 賦值號(hào)右邊的函數(shù)必須是一個(gè)賦值號(hào)右邊的函數(shù)必須是一個(gè)已經(jīng)定義過已經(jīng)定義過的,的,和函數(shù)指針?biāo)赶虻暮瘮?shù)一致和函數(shù)指針?biāo)赶虻暮瘮?shù)一致的函數(shù)。的函數(shù)。 (2)省略方括號(hào)的數(shù)組名是地址;省略圓括號(hào)省略方括號(hào)的數(shù)組名是地址;省略圓括號(hào)的函數(shù)名也是地址。的函數(shù)名也是地址。例如:例如:int fn1(char x, char y);int *fn2(char x,char y);int fn3(int a); int (*fp1)(char a,char b);int (*fp2)(int s); fp1=fn1;fp1=fn2;/Error!fp2=fn3;fp2=fp1;/Error!fp2=fn3(5);/Error!注意:注意:(1)一個(gè)函數(shù)不能賦給一個(gè)不一致的函數(shù)指一個(gè)函數(shù)不能賦給一個(gè)不一致的函數(shù)指針;兩個(gè)函數(shù)指針的相互賦值同樣
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)防爆電器行業(yè)十三五規(guī)劃及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)鋪管船市場(chǎng)競(jìng)爭(zhēng)狀況及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)鎢材產(chǎn)業(yè)十三五規(guī)劃及投資戰(zhàn)略研究報(bào)告
- 2025年吉林省安全員C證考試(專職安全員)題庫(kù)及答案
- 2025-2030年中國(guó)道路標(biāo)線行業(yè)規(guī)模分析及發(fā)展建議研究報(bào)告
- 2025-2030年中國(guó)蜂王漿凍干粉市場(chǎng)發(fā)展?fàn)顩r及營(yíng)銷戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)背光模組行業(yè)運(yùn)行狀況及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)翡翠玉鐲市場(chǎng)運(yùn)行狀況與前景趨勢(shì)分析報(bào)告
- 揚(yáng)州大學(xué)《室內(nèi)設(shè)計(jì)(實(shí)踐)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西藏職業(yè)技術(shù)學(xué)院《智能應(yīng)用系統(tǒng)開發(fā)》2023-2024學(xué)年第二學(xué)期期末試卷
- DeepSeek從入門到精通培訓(xùn)課件
- 2024-2025學(xué)年第二學(xué)期學(xué)??倓?wù)工作計(jì)劃(附2月-6月安排表行事歷)
- 23G409先張法預(yù)應(yīng)力混凝土管樁
- 《幼兒教育政策與法規(guī)》教案-單元5 幼兒的權(quán)利與保護(hù)
- 三年級(jí)下冊(cè)口算天天100題(A4打印版)
- 推進(jìn)優(yōu)質(zhì)護(hù)理-改善護(hù)理服務(wù)-PPT課件
- T∕CNFAGS 3-2021 三聚氰胺單位產(chǎn)品消耗限額
- 幾種藏文輸入法的鍵盤分布圖
- 山西公務(wù)員錄用審批表
- ASTM-D3330剝離強(qiáng)度測(cè)試標(biāo)準(zhǔn)中文版
- 零部件檢驗(yàn)卡
評(píng)論
0/150
提交評(píng)論