




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第四章功效(過程)抽象--函數(shù)第1頁本章內(nèi)容基于過程抽象程序設(shè)計子程序概念C++函數(shù)變量局部性和變量生存期標(biāo)識符作用域遞歸函數(shù)內(nèi)聯(lián)函數(shù)函數(shù)名重載條件編譯--程序調(diào)試與多環(huán)境程序編制標(biāo)準(zhǔn)庫函數(shù)第2頁基于過程抽象程序設(shè)計人們在設(shè)計一個復(fù)雜程序時,經(jīng)常會用到功效分解和復(fù)合兩種伎倆:功效分解:在進行程序設(shè)計時,首先把程序功效分解成若干子功效,每個子功效又能夠分解成若干子功效,等等,從而形成了一個自頂向下(top-down)、逐步精化(step-wise)設(shè)計過程。功效復(fù)合:把已經(jīng)有(子)功效逐步組合成更大(子)功效,從而形成一個自底向上(bottom-up)設(shè)計過程。過程抽象:一個功效使用者只需要知道對應(yīng)功效是什么(whattodo),而無須知道它是怎樣做(howtodo)。第3頁子程序子程序是取了名一段程序代碼,在程序中經(jīng)過名字來使用(調(diào)用)它們。子程序作用:降低重復(fù)代碼,節(jié)約勞動力實現(xiàn)過程抽象(功效抽象)封裝和信息隱藏作用語言功效擴充第4頁子程序之間數(shù)據(jù)傳遞一個子程序所需要數(shù)據(jù)往往要從調(diào)用者(也是一個子程序)那里取得,計算結(jié)果也需要返回給調(diào)用者。子程序之間數(shù)據(jù)傳遞方式能夠經(jīng)過:全局變量:全部子程序都能訪問到變量。(不好)參數(shù):形式參數(shù)(形參)和實在參數(shù)(實參)。值傳遞:把實參值復(fù)制一份給形參。地址或引用傳遞:把實參地址傳給形參。返回值機制:返回計算結(jié)果。第5頁C++函數(shù)函數(shù)是C++提供用于實現(xiàn)子程序語言成份。函數(shù)定義:
<返回值類型><函數(shù)名>(<形式參數(shù)表>)<函數(shù)體><返回值類型>描述了函數(shù)返回值類型,能夠為任意C++數(shù)據(jù)類型。當(dāng)返回值類型為void時,它表示函數(shù)沒有返回值。<函數(shù)名>用于標(biāo)識函數(shù)名字,用標(biāo)識符表示。<形式參數(shù)表>描述函數(shù)形式參數(shù),由零個、一個或多個形參說明(用逗號隔開)組成,形參說明格式為:
<類型><形參名>第6頁<函數(shù)體>
為一個<復(fù)合語句>,用于實現(xiàn)對應(yīng)函數(shù)功效。函數(shù)體內(nèi)能夠包含return語句,格式為:return<表示式>;return;當(dāng)函數(shù)體執(zhí)行到return語句時,函數(shù)馬上返回到調(diào)用者。假如有返回值,則把返回值帶回給調(diào)用者。假如return中<表示式>類型與函數(shù)<返回值類型>不一致,則進行隱式類型轉(zhuǎn)換,基本標(biāo)準(zhǔn)為:把<表示式>轉(zhuǎn)成<返回值類型>。注意:在函數(shù)體中不能用goto語句轉(zhuǎn)出函數(shù)體。第7頁函數(shù)例子intfactorial(intn)//求n階乘{(lán) inti,f=1; for(i=2;i<=n;i++)f*=i; returnf;}第8頁doublepower(doublex,intn)//求xn次冪{ if(x==0)return0; doubleproduct=1.0; if(n>=0) while(n>0) { product*=x; n--; } else while(n<0) { product/=x; n++; } returnproduct;}第9頁函數(shù)main每個C++程序都要定義一個名字為main函數(shù),C++程序執(zhí)行是從main開始。對于函數(shù)main,其返回值類型為int,比如:intmain(){ ...... ...return-1; ...... return0;}普通情況下,返回0表示程序正常結(jié)束;返回負(fù)數(shù)(如-1)表示程序非正常結(jié)束。第10頁函數(shù)調(diào)用
對于定義一個函數(shù),必須要調(diào)用它,它函數(shù)體才會執(zhí)行。除了函數(shù)main外,程序中對其它函數(shù)調(diào)用都是從main開始。main普通是由操作系統(tǒng)來調(diào)用。函數(shù)調(diào)用格式以下:<函數(shù)名>(<實在參數(shù)表>)<實在參數(shù)表>由零個、一個或多個表示式組成(逗號分割)實參個數(shù)和類型應(yīng)與對應(yīng)函數(shù)形參相同。類型假如不一樣,編譯器會試圖進行隱式轉(zhuǎn)換,轉(zhuǎn)換規(guī)則是把實參類型轉(zhuǎn)換成形參類型。注意:不能用goto語句從函數(shù)外轉(zhuǎn)入函數(shù)體第11頁函數(shù)調(diào)用例子......intmain(){ intx; cout<<"請輸入一個正整數(shù):"; cin>>x; cout<<"Factorialof"<<x<<"is" <<factorial(x)//調(diào)用階乘函數(shù)
<<endl; return0;}第12頁......intmain(){ doublea; intb; cout<<"請輸入a和b:"; cin>>a>>b; cout<<a<<""<<b<<"次方是:" <<power(a,b)<<endl; return0;}第13頁函數(shù)調(diào)用執(zhí)行過程計算實參值(對于多個實參,C++沒有要求計算次序);把實參分別傳遞給被調(diào)用函數(shù)形參;執(zhí)行函數(shù)體;函數(shù)體中執(zhí)行return語句返回函數(shù)調(diào)用點,調(diào)用點取得返回值(假如有返回值)并執(zhí)行調(diào)用之后操作。能夠把有返回值函數(shù)調(diào)用作為操作數(shù)放在表示式中參加運算:x+power(x,y)*z
第14頁函數(shù)申明程序中調(diào)用全部函數(shù)都要有定義。假如函數(shù)定義在其它文件(如:C++標(biāo)準(zhǔn)庫)中或定義在根源文件中使用點之后,則在調(diào)用前需要對被調(diào)用函數(shù)進行申明。函數(shù)申明格式以下:<返回值類型><函數(shù)名>(<形式參數(shù)表>);//函數(shù)原型或extern<返回值類型><函數(shù)名>(<形式參數(shù)表>);在函數(shù)申明中,<形式參數(shù)表>中能夠只列出形參類型而不寫形參名
第15頁//file2.cppintg(inti)//定義{externintx,y;//申明
intz;//定義
z=x+y;returnz+i;}//file1.cppintx=0;//定義intmain()//定義{externvoidf();//申明
externintg(int);//申明
externinty;//申明
y=x+2;f();//調(diào)用
y=g(x);//調(diào)用
return0;}inty=0;//定義voidf()//定義{x=y+1;}函數(shù)申明作用是什么?第16頁例:用函數(shù)實現(xiàn)求小于n全部素數(shù)。#include<iostream>#include<cmath>usingnamespacestd;boolis_prime(intn);//函數(shù)申明voidprint_prime(intn,intcount);//函數(shù)申明intmain(){ inti,n,count=1; cout<<"請輸入一個正整數(shù):" cin>>n;//從鍵盤輸入一個正整數(shù)
if(n<2)return-1; cout<<2<<",";//輸出第一個素數(shù)
for(i=3;i<n;i+=2) { if(is_prime(i)) { count++;
print_prime(i,count); } } cout<<endl; return0;}第17頁boolis_prime(intn){ inti,j,k=sqrt(n); for(i=2,j=k;i<=j;i++) if(n%i==0)returnfalse; returntrue;}voidprint_prime(intn,intcount){ cout<<n<<','; if(count%6==0)cout<<endl;}第18頁函數(shù)參數(shù)傳遞C++提供了兩種參數(shù)傳遞機制:值傳遞把實參值賦值給形參。地址或引用傳遞把實參地址賦值給形參。C++默認(rèn)參數(shù)傳遞方式是值傳遞。第19頁值傳遞在函數(shù)調(diào)用時,采取類似變量初始化形式把實參值傳給形參。函數(shù)執(zhí)行過程中,經(jīng)過形參取得實參值,函數(shù)體中對形參值改變不會影響對應(yīng)實參值。第20頁值參數(shù)傳遞例子//函數(shù)main調(diào)用函數(shù)power計算ab#include<iostream>usingnamespacestd;doublepower(doublex,intn);intmain(){ doublea=3.0,c; intb=4; c=power(a,b); cout<<a<<","<<b<<","<<c<<endl; return0;}第21頁doublepower(doublex,intn){ if(x==0)return0; doubleproduct=1.0; if(n>=0) while(n>0) { product*=x; n--; } else while(n<0) { product/=x; n++; } returnproduct;}第22頁執(zhí)行main時,產(chǎn)生三個變量(分配內(nèi)存空間)a、b和c:
a:3.0b:4c:?調(diào)用power函數(shù)時,又產(chǎn)生三個個變量x、n和product,然后分別用a、b以及1.0對它們初始化:
a:3.0b:4c:? x:3.0n:4product:1.0函數(shù)power中循環(huán)結(jié)束后(函數(shù)返回前):
a:3.0b:4c:? x:3.0n:0product:81.0函數(shù)power返回后:
a:3.0b:4c:81.0第23頁變量局部性在C++中,依據(jù)變量定義位置,把變量分成:局部變量和全局變量。
局部變量是指在復(fù)合語句中定義變量,它們只能在定義它們復(fù)合語句(包含內(nèi)層復(fù)合語句)中使用。全局變量是指在函數(shù)外部定義變量,它們普通能被程序中全部函數(shù)使用(靜態(tài)全局變量除外)。第24頁局部變量和全局變量例子intx=0;//全局變量voidf(){ inty=0;//局部變量
x++;//OK y++;//OK a++;//Error}intmain(){ inta=0;//局部變量
f(); a++;//OK x++;//OK y++;//Error
while(x<10) {intb=0;//局部變量
a++;//OK b++;//OK x++;//OK } b++;//Error return0;}第25頁變量生存期(存放分配)把程序運行時一個變量占有內(nèi)存空間時間段稱為該變量生存期。靜態(tài):從程序開始執(zhí)行時就進行內(nèi)存空間分配,直到程序結(jié)束才收回它們空間。全局變量含有靜態(tài)生存期。自動:內(nèi)存空間在程序執(zhí)行到定義它們復(fù)合語句(包含函數(shù)體)時才分配,當(dāng)定義它們復(fù)合語句執(zhí)行結(jié)束時,它們空間將被收回。局部變量和函數(shù)參數(shù)普通含有自動生存期。動態(tài):內(nèi)存空間在程序中顯式地用new操作或malloc庫函數(shù)分配、用delete操作或free庫函數(shù)收回。動態(tài)變量含有動態(tài)生存期。含有靜態(tài)生存期變量,假如沒有顯式初始化,系統(tǒng)將把它們初始化成0。第26頁存放類修飾符在定義局部變量時,能夠為它們加上存放類修飾符來顯式地指出它們生存期。auto:使局部變量含有自動生存期。局部變量默認(rèn)存放類為auto。static:使局部變量含有靜態(tài)生存期。它只在函數(shù)第一次調(diào)用時進行初始化,以后調(diào)用中不再進行初始化,它值為上一次函數(shù)調(diào)用結(jié)束時值。register:使局部變量也含有自動生存期,由編譯程序依據(jù)CPU存放器使用情況來決定是否存放在存放器中。第27頁voidf(){autointx=0;//auto普通不寫
staticinty=1;registerintz=0;x++;y++;z++;cout<<x<<y<<z<<endl;}第一次調(diào)用f時,輸出:121第二次調(diào)用f時,輸出:131第28頁程序?qū)嶓w在內(nèi)存中安排靜態(tài)數(shù)據(jù)區(qū)用于全局變量、static存放類局部變量以及常量內(nèi)存分配。代碼區(qū)用于存放程序指令,對C++程序而言,代碼區(qū)存放是全部函數(shù)代碼;棧區(qū)用于auto存放類局部變量、函數(shù)形式參數(shù)以及函數(shù)調(diào)用時相關(guān)信息(如:函數(shù)返回地址等)內(nèi)存分配;堆區(qū)用于動態(tài)變量內(nèi)存分配。
靜態(tài)數(shù)據(jù)區(qū)代碼區(qū)棧區(qū)堆區(qū)第29頁C++程序多模塊結(jié)構(gòu)邏輯上,一個C++程序由一些全局函數(shù)(區(qū)分于類定義中組員函數(shù))、全局常量、全局變量/對象以及類定義組成,其中必須有且僅有一個名字為main全局函數(shù)。函數(shù)內(nèi)部能夠包含形參、局部常量、局部變量/對象定義以及語句。物理上,能夠按某種規(guī)則對組成C++程序各個邏輯單位(全局函數(shù)、全局常量、全局變量/對象、類等)定義進行分組,分別把它們放在若干個源文件中,組成程序模塊。程序模塊是為了便于從物理上對程序進行組織、管理和了解,便于多人合作開發(fā)一個程序。程序模塊是可單獨編譯程序單位。第30頁C++模塊組成一個C++模塊普通包含兩個部分:接口(.h文件):給出在本模塊中定義、提供給其它模塊使用一些程序?qū)嶓w(如:函數(shù)、全局變量等)申明;實現(xiàn)(.cpp文件):模塊實現(xiàn)給出了模塊中程序?qū)嶓w定義。第31頁在模塊A中要用到模塊B中定義程序?qū)嶓w時,能夠在A.cpp文件中用文件包含命令(#include)把B.h文件包含進來。文件包含命令是一個編譯預(yù)處理命令,其格式為:
#include<文件名>或#include"文件名"include命令含義是:在編譯前,用命令中文件名所指定文件內(nèi)容替換該命令。第32頁//file1.hexternintx;//全局變量x申明externdoubley;//全局變量y申明intf();//全局函數(shù)f申明//file1.cppintx=1;//全局變量x定義doubley=2.0;//全局變量y定義intf()//全局函數(shù)f定義{ intm;//局部變量m定義
...... m+=x;//語句
...... returnm;}第33頁//file2.hvoidg();//全局函數(shù)g申明//file2.cpp#include"file1.h"http://把文件file1.h中內(nèi)容包含進來voidg()//全局函數(shù)g定義{ doublez;//局部變量z定義
...... z=y+10;//語句
......}第34頁//main.cpp#include"file1.h"http://把文件file1.h中內(nèi)容包含進來#include"file2.h"http://把文件file2.h中內(nèi)容包含進來intmain()//全局函數(shù)main定義{ doubler;//局部變量r定義
...... r=x+y*f();//語句
...... g();//語句
......}第35頁標(biāo)識符作用域為了對程序中實體名字進行管理,引進了標(biāo)識符作用域概念。一個定義了標(biāo)識符有效范圍(能被訪問程序段)稱為該標(biāo)識符作用域。在不一樣作用域中,能夠用相同標(biāo)識符來標(biāo)識不一樣程序?qū)嶓w。第36頁C++標(biāo)識符作用域C++把標(biāo)識符作用域分成若干類,其中包含:局部作用域全局作用域文件作用域函數(shù)作用域函數(shù)原型作用域類作用域名空間作用域第37頁局部作用域在函數(shù)定義或復(fù)合語句中、從標(biāo)識符定義點開始到函數(shù)定義或復(fù)合語句結(jié)束之間程序段。C++中局部常量名、局部變量名/對象名以及函數(shù)形參名含有局部作用域。第38頁voidf(intn){x++;//Errorintx=0;x++; n++; .......}voidg(){x++;//Errorn++;//Error}intmain(){intx=0;intn;cin>>n;f(n); ......}第39頁假如在一個標(biāo)識符局部作用域中包含內(nèi)層復(fù)合語句,而且在該內(nèi)層復(fù)合語句中定義了一個同名不一樣實體,則外層定義標(biāo)識符作用域應(yīng)該是從其潛在作用域中扣除內(nèi)層同名標(biāo)識符作用域之后所得到作用域。voidf(){ intx;//外層x定義
...x...//外層x while(...x...)//外層x {...x...//外層x,
doublex;//內(nèi)層x定義
...x...//內(nèi)層x } ...x...//外層x}第40頁全局作用域在函數(shù)級定義標(biāo)識符含有全局作用域。全局變量名/對象名、全局函數(shù)名和全局類名作用域普通含有全局作用域,它們在整個程序中可用。假如在某個局部作用域中定義了與某個全局標(biāo)識符同名標(biāo)識符,則該全局標(biāo)識符作用域應(yīng)扣掉與之同名局部標(biāo)識符作用域。在局部標(biāo)識符作用域中若要使用與其同名全局標(biāo)識符,則需要用全局域選擇符(::)對全局標(biāo)識符進行修飾(受限)。第41頁doublex;//外層x定義voidf(){ intx;//內(nèi)層x定義
...x...//內(nèi)層x ...::x...//外層x}第42頁文件作用域在全局標(biāo)識符定義中加上static修飾符,則該全局標(biāo)識符就成了含有文件作用域標(biāo)識符,它們只能在定義它們源文件(模塊)中使用。C++中關(guān)鍵詞static有兩個不一樣含義。在局部變量定義中,static修飾符用于指定局部變量采取靜態(tài)存放分配;而在全局標(biāo)識符定義中,static修飾符用于把全局標(biāo)識符作用域改變?yōu)槲募饔糜颉?/p>
普通情況下,含有全局作用域標(biāo)識符主要用于標(biāo)識被程序各個模塊共享程序?qū)嶓w,而含有文件作用域標(biāo)識符用于標(biāo)識在一個模塊內(nèi)部共享程序?qū)嶓w。第43頁//file1.cppstaticinty;//文件作用域staticvoidf()//文件作用域{......}//file2.cppexterninty;externvoidf();voidg(){...y...//Errorf();//Error}第44頁函數(shù)作用域語句標(biāo)號是唯一含有函數(shù)作用域標(biāo)識符,它們在定義它們函數(shù)體中任何地方都能夠訪問。函數(shù)作用域與局部作用域區(qū)分是:函數(shù)作用域包含整個函數(shù),而局部作用域是從定義點開始到函數(shù)定義或復(fù)合語句結(jié)束。在函數(shù)體中,一個語句標(biāo)號只能定義一次,即使是在內(nèi)層復(fù)合語句中,也不能再定義與外層相同語句標(biāo)號。第45頁voidf(){ ...... gotoL;//OK ...... L:... ......{......L:...//Error ......} ...... gotoL;//OK ......}voidg(){ ...... gotoL;//Error ......}第46頁名空間作用域?qū)τ谝粋€多文件組成程序,有時見面臨一個問題:在一個源文件中要用到兩個分別在另外兩個源文件中定義不一樣全局程序?qū)嶓w(如:全局函數(shù)),而這兩個全局程序?qū)嶓w名字相同。C++提供了名空間(namespace)設(shè)施來處理上述名沖突問題。在一個名空間中定義全局標(biāo)識符,其作用域為該名空間。當(dāng)在一個名空間外部需要使用該名空間中定義全局標(biāo)識符時,可用該名空間名字來修飾或受限。第47頁//模塊1namespaceA{ intx=1; voidf() {...... }}//模塊2namespaceB{ intx=0; voidf() {...... }}...A::x...//A中xA::f();//A中f...B::x...//B中xB::f();//B中fusingnamespaceA;...x...//A中xf();//A中f...B::x...//B中xB::f();//B中fusingA::f;...A::x...//A中x
f();//A中f...B::x...//B中xB::f();//B中f//模塊31、2、3、第48頁遞歸函數(shù)函數(shù)調(diào)用是能夠嵌套。voidh(){......}voidg(){......h();......}voidf(){......g();.......}第49頁直接遞歸voidf(){..........f()..........}間接遞歸externvoidg();voidf(){..........g()..........}voidg(){.........f().........}假如一個函數(shù)在其函數(shù)體中直接或間接地調(diào)用了自己,則該函數(shù)稱為遞歸函數(shù)。第50頁遞歸函數(shù)作用在程序設(shè)計中經(jīng)常需要實現(xiàn)重復(fù)性操作。循環(huán)為實現(xiàn)重復(fù)操作提供了一個路徑。實現(xiàn)重復(fù)操作另一個路徑是采取遞歸函數(shù)。“分而治之”(DivideandConquer)設(shè)計方法:把一個問題分解成若干個子問題,而每個子問題性質(zhì)與原問題相同,只是在規(guī)模上比原問題要小。每個子問題求解過程能夠采取與原問題相同方式來進行。遞歸函數(shù)為上述設(shè)計方法提供了一個自然、簡練實現(xiàn)機制第51頁例:求第n個fibonacci數(shù)(遞歸解法)intfib(intn){ if(n==1||n==2) return1; else returnfib(n-2)+fib(n-1);}第52頁遞歸函數(shù)執(zhí)行過程//用遞歸函數(shù)求n!
intf(intn){ if(n==0) return1; else returnn*f(n-1);}第53頁遞歸條件和結(jié)束條件在定義遞歸函數(shù)時,一定要對兩種情況給出描述:遞歸條件。指出何時進行遞歸調(diào)用,它描述了問題求解普通情況,包含:分解和綜合過程。結(jié)束條件。指出何時不需遞歸調(diào)用,它描述了問題求解特殊情況或基本情況第54頁例:解漢諾塔問題
漢諾塔問題:有A,B,C三個柱子,柱子A上穿有n個大小不一樣圓盤,大盤在下,小盤在上?,F(xiàn)要把柱子A上全部圓盤移到柱子B上,要求每次只能移動一個圓盤,且大盤不能放在小盤上,移動時可借助柱子C。編寫一個C++函數(shù)給出移動步驟,如:n=3時,移動步驟為:1:A
B,2:A
C,1:B
C,3:A
B,1:C
A,2:C
B,1:A
B。
ABC第55頁當(dāng)n=1時,只要把1個圓盤從A移至B就能夠了cout<<"1:A
B"<<endl;當(dāng)n大于1時,我們能夠把該問題分解成下面三個子問題:把n-1個圓盤從柱子A移到柱子C。把第n個圓盤從柱子A移到柱子B。cout<<n<<":A->B"<<endl;把n-1個圓盤從柱子C移到柱子B。上面子問題1和3與原問題相同,只是盤子個數(shù)少了一個以及移動位置不一樣;子問題2是移動一個盤子簡單問題。第56頁#include<iostream>usingnamespacestd;voidhanoi(charx,chary,charz,intn)//把n個圓盤從x表示
//柱子移至y所表示柱子。{ if(n==1) cout<<"1:"<<x<<"→"<<y<<endl;//把第1個
//盤子從x表示柱子移至y所表示柱子。
else { hanoi(x,z,y,n-1);//把n-1個圓盤從x表示柱子移至
//z所表示柱子。
cout<<n<<":"<<x<<"→"<<y<<endl; //把第n個圓盤從x表示柱子移至y所表示柱子。
hanoi(z,y,x,n-1);//把n-1個圓盤從z表示柱子移至
//y所表示柱子。
}}第57頁遞歸與循環(huán)選擇對于一些遞歸定義問題,用遞歸函數(shù)來處理會顯得比較自然和簡練,而用循環(huán)來處理這么問題,有時會很復(fù)雜,不易設(shè)計和了解。在實現(xiàn)數(shù)據(jù)操作上,它們有一點不一樣:循環(huán)是在同一組變量上進行重復(fù)操作(循環(huán)經(jīng)常又稱為迭代)遞歸則是在不一樣變量組(屬于遞歸函數(shù)不一樣實例)上進行重復(fù)操作。遞歸缺點:因為遞歸表示重復(fù)操作是經(jīng)過函數(shù)調(diào)用來實現(xiàn),而函數(shù)調(diào)用是需要開銷;棧空間大小也會限制遞歸深度。遞歸算法有時會出現(xiàn)重復(fù)計算。第58頁處理小函數(shù)低效問題因為函數(shù)調(diào)用是需要開銷,尤其是對一些小函數(shù)頻繁調(diào)用將使程序效率有很大降低。C++提供了兩種處理上述問題方法:宏定義內(nèi)聯(lián)函數(shù)第59頁宏定義在C++中,利用一個編譯預(yù)處理命令:宏定義,用它能夠?qū)崿F(xiàn)類似函數(shù)功效:#define凵<宏名>(<參數(shù)表>)凵<文字串>比如:#define凵max(a,b)凵(((a)>(b))?(a):(b))在編譯之前,將對宏使用進行文字替換!比如:編譯前將把cout<<max(x,y);替換成:cout<<(((x)>(y))?(x):(y));第60頁宏定義不足之處需要加上很多括號。比如:#definemax(a,b)a>b?a:b10+max(x,y)+z將被替換成:10+x>y?x:y+z有時會出現(xiàn)重復(fù)計算。比如:#define凵max(a,b)凵(((a)>(b))?(a):(b))max(x+1,y*2)將被替換成:(((x+1)>(y*2))?(x+1):(y*2))不進行參數(shù)類型檢驗和轉(zhuǎn)換。
不利于一些工具對程序處理。第61頁內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)是指在定義函數(shù)定義時,在函數(shù)返回類型之前加上一個關(guān)鍵詞inline,比如:inlineintmax(inta,intb){ returna>b?a:b;}內(nèi)聯(lián)函數(shù)作用是提議編譯程序把該函數(shù)函數(shù)體展開到調(diào)用點,以提升函數(shù)調(diào)用效率。內(nèi)聯(lián)函數(shù)形式上屬于函數(shù),它遵照函數(shù)一些要求,如:參數(shù)類型檢驗與轉(zhuǎn)換。使用內(nèi)聯(lián)函數(shù)時應(yīng)注意以下幾點:編譯程序?qū)?nèi)聯(lián)函數(shù)限制。內(nèi)聯(lián)函數(shù)名含有文件作用域。第62頁帶缺省值形式參數(shù)在C++中允許在申明函數(shù)時,為函數(shù)一些參數(shù)指定默認(rèn)值。假如調(diào)用這些函數(shù)時沒有提供對應(yīng)實參,則對應(yīng)形參采取指定默認(rèn)值。比如,對于下面函數(shù)申明:voidprint(intvalue,intbase=10);下面調(diào)用:print(28);//28傳給value;10傳給baseprint(32,2);//28傳給value;2傳給base第63頁在指定函數(shù)參數(shù)默認(rèn)值時,應(yīng)注意下面幾點:有默認(rèn)值形參應(yīng)處于形參表右部。比如:voidf(inta,intb=1,intc=0);//OKvoidf(inta,intb=1,intc);//Error
對參數(shù)默認(rèn)值指定只在函數(shù)申明(包含定義性申明)處有意義。在不一樣源文件中,對同一個函數(shù)申明能夠?qū)λ粋€參數(shù)指定不一樣默認(rèn)值;在同一個源文件中,對同一個函數(shù)申明只能對它每一個參數(shù)指定一次默認(rèn)值。
第64頁函數(shù)名重載對于一些功效相同、參數(shù)類型或個數(shù)不一樣函數(shù),有時給它們?nèi)∠嗤謺硎褂蒙戏奖?。比如,把下面函?shù):voidprint_int(inti){......}voidprint_double(doubled){......}voidprint_char(charc){......}voidprint_A(Aa){......}//A為自定義類型定義為:voidprint(inti){......}voidprint(doubled){......}voidprint(charc){......}voidprint(Aa){......}上述函數(shù)定義形式稱為函數(shù)名重載。第65頁對重載函數(shù)調(diào)用綁定確定一個對重載函數(shù)調(diào)用對應(yīng)著哪一個重載函數(shù)定義過程稱為綁定(binding,又稱定聯(lián)、聯(lián)編、捆綁)。比如:print(1.0)將調(diào)用voidprint(doubled){......}對重載函數(shù)調(diào)用綁定在編譯時刻由編譯程序依據(jù)實參加形參匹配情況來決定。從形參個數(shù)與實參個數(shù)相同重載函數(shù)中按下面規(guī)則選擇一個:準(zhǔn)確匹配提升匹配標(biāo)準(zhǔn)轉(zhuǎn)換匹配自定義轉(zhuǎn)換匹配匹配失敗第66頁準(zhǔn)確匹配類型相同對實參進行“微小”類型轉(zhuǎn)換:數(shù)組變量名->數(shù)組首地址函數(shù)名->函數(shù)首地址等等比如,對于下面重載函數(shù)定義:
voidprint(int); voidprint(double); voidprint(char);下面函數(shù)調(diào)用:
print(1);綁定到函數(shù):voidprint(int); print(1.0);綁定到函數(shù):voidprint(double); print('a');綁定到函數(shù):voidprint(char);第67頁提升匹配先對實參進行下面類型提升,然后進行準(zhǔn)確匹配:按整型提升規(guī)則提升實參類型把float類型實參提升到double把double類型實參提升到longdouble比如,對于下述重載函數(shù):voidprint(int);voidprint(double);依據(jù)提升匹配,下面函數(shù)調(diào)用:print('a');綁定到函數(shù):voidprint(int);print(1.0f);綁定到函數(shù):voidprint(double);
第68頁標(biāo)準(zhǔn)轉(zhuǎn)換匹配任何算術(shù)類型能夠相互轉(zhuǎn)換枚舉類型能夠轉(zhuǎn)換成任何算術(shù)類型零能夠轉(zhuǎn)換成任何算術(shù)類型或指針類型任何類型指針能夠轉(zhuǎn)換成void*派生類指針能夠轉(zhuǎn)換成基類指針每個標(biāo)準(zhǔn)轉(zhuǎn)換都是平等。
第69頁比如,對于下述重載函數(shù):voidprint(char);voidprint(char*);依據(jù)標(biāo)準(zhǔn)轉(zhuǎn)換匹配,下面函數(shù)調(diào)用:print(1);綁定到函數(shù):voidprint(char);第70頁綁定失敗假如不存在匹配或存在多個匹配,則綁定失敗比如,對于下述重載函數(shù):voidprint(char);voidprint(double);依據(jù)標(biāo)準(zhǔn)轉(zhuǎn)換匹配,下面函數(shù)調(diào)用將會綁定失敗:print(1);因為依據(jù)標(biāo)準(zhǔn)轉(zhuǎn)換,1(屬于int型)既能夠轉(zhuǎn)成char,又能夠轉(zhuǎn)成double處理方法是:對實參進行顯式類型轉(zhuǎn)換,如,print((char)1)或print((double)1)增加額外重載,如,增加一個重載函數(shù)定義:voidprint(int);第71頁C++標(biāo)準(zhǔn)庫函數(shù)為了方便程序設(shè)計,C++語言每個實現(xiàn)往往會提供一個標(biāo)準(zhǔn)庫,其中定義了一些語言本身沒有提供功效:慣用數(shù)學(xué)函數(shù)字符串處理函數(shù)以及輸入/輸出,等等在C++標(biāo)準(zhǔn)庫中,依據(jù)功效對定義程序?qū)嶓w進行了分類,把每一類程序?qū)嶓w申明分別放在一個頭文件中。在C++中,把從C語言保留下來庫函數(shù),重新定義在名空間std中;對對應(yīng)頭文件進了重新命名:*.h->c*第72頁一些標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(cmath或math.h)intabs(intn);//int型絕對值longlabs(longn);//longint型絕對值doublefabs(doublex);//double型絕對值doublesin(doublex);//正弦函數(shù)doublecos(doublex);//余弦函數(shù)doubletan(doublex);//正切函數(shù)doubleasin(doublex);//反正弦函數(shù)doubleacos(doublex);//反余弦函數(shù)doubleatan(doublex);//反正切函數(shù)doubleceil(doublex);//大于x最小整數(shù)(返回值為以
//double表示整型數(shù))doublefloor(doublex);//小于x最大整數(shù)(返回值為以
//double表示整型數(shù))doublelog(doublex);//自然對數(shù)doublelog10(doublex);//以10為底對數(shù)doublesqrt(doublex);//平方根doublepow(doublex,doubley);//xy次冪第73頁編譯預(yù)處理命令C++程序中能夠?qū)懸恍┕┚幾g程序使用命令:編譯預(yù)處理命令。編譯預(yù)處理命令不是C++程序所要完成功效,而是用于對編譯過程給出指導(dǎo),其功效由編譯預(yù)處理系統(tǒng)來完成。編譯預(yù)處理命令主要有:文件包含命令(#include)宏定義(#define)命令條件編譯命令第74頁條件編譯編譯程
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 民間投資合作協(xié)議合同范文
- 企業(yè)間房產(chǎn)轉(zhuǎn)讓合同細(xì)則
- 軍人離婚正式合同書模板
- 9 古詩三首 雪梅教學(xué)設(shè)計-2024-2025學(xué)年四年級上冊語文統(tǒng)編版
- 2 日晷 教學(xué)設(shè)計-2023-2024學(xué)年科學(xué)四年級下冊大象版
- 小學(xué)2024年教育教學(xué)專項發(fā)展規(guī)劃執(zhí)行、完成情況
- 個人土地交易合同及相關(guān)條款
- 10《我們所了解的環(huán)境污染》(教學(xué)設(shè)計)-統(tǒng)編版道德與法治四年級上冊
- 2024-2025學(xué)年人教版(2024)七年級英語上冊寒假教學(xué)設(shè)計day7
- 員工服裝合同范本
- 工廠廠區(qū)道路拆除實施方案
- 公寓管家培訓(xùn)課件
- 新大象版科學(xué)四年級下冊全冊教學(xué)設(shè)計
- 《民間工藝美術(shù)》課件
- 車站值班員(中級)職業(yè)鑒定題庫(含答案)
- 2025教科版一年級科學(xué)下冊教學(xué)計劃
- 分娩前的準(zhǔn)備
- 部編版小學(xué)三年級語文下冊作文教學(xué)計劃
- 中學(xué)生勞動安全課件
- 辦公樓維修改造施工方案
- 2024年醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范培訓(xùn)課件
評論
0/150
提交評論