C++程序設計教程(第二版)課件_第1頁
C++程序設計教程(第二版)課件_第2頁
C++程序設計教程(第二版)課件_第3頁
C++程序設計教程(第二版)課件_第4頁
C++程序設計教程(第二版)課件_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C++程序設計教程(第二版)第五章函數(shù)機制Chapter5

FunctionMechanism

清華大學出版社錢能8/8/20231C++程序設計教程(第二版)第五章函數(shù)機制清華大學出版社函數(shù)

C++的函數(shù)是完成既定任務的功能(過程)體,它涵蓋了數(shù)學函數(shù)和一般過程.所以基于過程編程本質上就是基于函數(shù)編程函數(shù)機制一是指程序運行過程中對函數(shù)調用的數(shù)據(jù)管理和處理過程

二是指編程中函數(shù)的使用規(guī)范.它包括函數(shù)參數(shù)的屬性和傳遞規(guī)則,函數(shù)返回類型的匹配與審查,函數(shù)名字的識別原則,函數(shù)體效率的選擇,函數(shù)體中數(shù)據(jù)的訪問權限等8/8/20232函數(shù)8/1/20232第五章內容函數(shù)性質(FunctionCharacter)

指針參數(shù)(PointerParameters)

棧機制(StackMechanism)

函數(shù)指針(FunctionPointers)main參數(shù)(Themain’sParameters)

遞歸函數(shù)(RecursiveFunctions)

函數(shù)重載(FunctionOverload)

8/8/20233第五章內容函數(shù)性質(FunctionCharacter1.函數(shù)性質(FunctionCharacter)函數(shù):對輸入?yún)?shù)負責,埋頭做自己的事,最終返回結果函數(shù)組織:通過在函數(shù)中進行函數(shù)調用來擴展運行的規(guī)模,層層疊疊的函數(shù)構成樹結構做法:將若干個函數(shù)組織成文件,又將若干個文件構成程序的辦法來進行編程分工8/8/202341.函數(shù)性質(FunctionCharacter跨越數(shù)學函數(shù)的C++函數(shù),有四種形態(tài)返回類型func(參數(shù)列表);返回類型func();voidfunc(參數(shù)列表);voidfunc();8/8/20235跨越數(shù)學函數(shù)的C++函數(shù),有四種形態(tài)返回類型func(黑盒原則:函數(shù)使用者應關注性能,而少去左右實現(xiàn)細節(jié)intcost(intn,intm){

returnn*10;//運輸n次m斤}intcost(intn,intm){

returnm*10;//運輸m次n斤}//選擇下一個最好的intcost(intn,intm){

return(n>m?m:n)*10;//保證運輸次數(shù)最少}8/8/20236黑盒原則:函數(shù)使用者應關注性能,而少去左右實現(xiàn)細節(jié)int參數(shù)傳遞:形參是對實參的克隆,克隆必須遵守類型匹配規(guī)則voidf(Typea);//a為形參voidg(){Typex;f(x);//x為實參}a實體x實體復制Type類型Type類型8/8/20237參數(shù)傳遞:形參是對實參的克隆,克隆必須遵守類型匹配規(guī)則voi2.指針參數(shù)(PointerParameters)傳遞指針:指針參數(shù)也是值傳遞的,指針值的真正用途是進行數(shù)據(jù)間訪,以達到操作數(shù)據(jù)塊(大小由之)的目的傳遞引用:引用參數(shù)本質上也是值傳遞的,它表現(xiàn)為名字傳遞,即以形參的名字來代替實參名字.如果實參不是實體名而是表達式,那么其表達式所對應的臨時實體取名為形參,并要求其為常量引用意義:指針和引用參數(shù)的存在,使函數(shù)實際上可以訪問非局部的數(shù)據(jù)區(qū),函數(shù)的黑盒性便名存實亡.但這并非一定壞事,指針是一把雙刃劍,或靈巧或邪惡.引用是為了防范指針非安全的無意操作8/8/202382.指針參數(shù)(PointerParametersvoidmySort(int*b,intsize);voidf(){inta[]={3,5,7,1,8,4,9};mySort(a,sizeof(a)/sizeof(a[0]));}傳遞指針須附帶傳遞單位數(shù)據(jù)的個數(shù)元素個數(shù)傳指針8/8/20239voidmySort(int*b,intsize);限制無意操作帶來的意外副作用vector<int>add(//向量加法

constvector<int>&a,

constvector<int>&b){vector<int>c(a.size());

for(unsignedi=0;i<a.size();++i)c[i]=a[i]+b[i];

returnc;}8/8/202310限制無意操作帶來的意外副作用vector<int>add(3.棧機制(StackMechanism)運行時內存布局棧區(qū)進程空間代碼區(qū)全局數(shù)據(jù)區(qū)堆區(qū)8/8/2023113.棧機制(StackMechanism)運行未初始化局部數(shù)據(jù)的不確定性#include<iostream>voidf(){

intb;//未初始化std::cout<<”B=>”<<b<<“\n”;}//-------------------------intmain(){

inta;//未初始化std::cout<<”A=>”<<a<<“\n”;f();}//-------------------------//8804248//27880488/8/202312未初始化局部數(shù)據(jù)的不確定性#include<iostream#include<iostream>inta=5;intb=6;intmain(){int*ap=(int*)4202660;*ap=8;std::cout<<a<<“\n”;std::cout<<int(&b)<<“\n”;}//8//4202664

指針的無約束性5642026604202664ab4202660ap8/8/202313#include<iostream>指針的無約束性564204.函數(shù)指針(FunctionPointers)函數(shù)類型:函數(shù)類型因參數(shù)類型、個數(shù)和排列順序的不同而不同,也因返回類型的不同而不同.函數(shù)指針:指向代碼區(qū)中函數(shù)體代碼的指針.不同的函數(shù)類型,其函數(shù)指針也不同用法:函數(shù)指針經(jīng)常用作函數(shù)參數(shù),以傳遞連函數(shù)本身都不知道的處理過程(函數(shù))8/8/2023144.函數(shù)指針(FunctionPointers不同的函數(shù)指針,不能相互賦值intg(int);int(*gp)(int)=g;voidf();void(*fp)();fp=f;gp=fp;//error不同的函數(shù)8/8/202315不同的函數(shù)指針,不能相互賦值intg(int);不同的函數(shù)函數(shù)指針作為參數(shù)傳遞(函數(shù)名看作是函數(shù)指針)boollessThanBitSum(inta,intb){

intsuma=0,sumb=0;

for(intx=a;x;x/=10)suma+=x%10;for(intx=b;x;x/=10)sumb+=x%10;

returnsuma<sumb;}intmain(){

inta[]={33,61,12,19,14,71,78,59};sort(aa,aa+8,lessThanBitSum);

for(inti=0;i<8;++i)cout<<aa[i]<<"";cout<<"\n";}//12143361711959788/8/202316函數(shù)指針作為參數(shù)傳遞(函數(shù)名看作是函數(shù)指針)boolle指定函數(shù)指針類型,定義函數(shù)指針數(shù)組typedef

void(*MenuFun)();voidf1(){cout<<"good!\n";}voidf2(){cout<<"better!\n";}voidf3(){cout<<"best!\n";}MenuFunfun[]={f1,f2,f3};指針類型名8/8/202317指定函數(shù)指針類型,定義函數(shù)指針數(shù)組typedefvoid5.main參數(shù)(Themain’sParameters)程序運行:操作系統(tǒng)讀入命令以啟動程序重定向命令:操作系統(tǒng)讀入命令后,識別并自我消化的參數(shù)main函數(shù)參數(shù):操作系統(tǒng)讀入命令后,不能識別參數(shù),將其直接傳遞給所啟動的程序8/8/2023185.main參數(shù)(Themain’sParam命令重定向//f0509.cpp#include<iostream>usingnamespacestd;intmain(){for(inta,b;cin>>a>>b;)cout<<a+b<<”\n”;}E:\ch05>f0509<abc.txt↙17213578991212345abc.txt8/8/202319命令重定向//f0509.cppE:\ch05>f0509main函數(shù)參數(shù)//f0510.cpp#include<iostream>usinganmespacestd;intmain(intargc,char**argv){

for(inti=0;i<argc;++i)cout<<argv[i]<<endl;}E:\ch05>f0510a1a2a3↙f0510a1a2a38/8/202320main函數(shù)參數(shù)//f0510.cppE:\ch05>f06.遞歸函數(shù)(RecursiveFunctions)形式上:一個正在執(zhí)行的函數(shù)調用了自身(直接遞歸).或者,一個函數(shù)調用了另一個函數(shù),而另一個函數(shù)卻調用了本函數(shù)(間接遞歸)本質上:程序在運行中調用了相同代碼實體的函數(shù),卻在函數(shù)棧中重新復制了該函數(shù)的整套數(shù)據(jù),由于每套數(shù)據(jù)中的參數(shù)也許不同,導致了計算條件發(fā)生變化,使得函數(shù)得以逐步逼近終極目標而運行8/8/2023216.遞歸函數(shù)(RecursiveFunction遞歸函數(shù)可以轉換為非遞歸函數(shù)

例如,求最大公約數(shù)longgcd1(inta,intb)//遞歸版{

if(a%b==0)

returnb;

returngcd(b,a%b);}//--------------------------longgcd2(inta,intb)//非遞歸版{

for(inttemp;b;a=b,b=temp)temp=a%b;

returna;}//--------------------------8/8/202322遞歸函數(shù)可以轉換為非遞歸函數(shù)

例如,求最大公約數(shù)longg7.函數(shù)重載(FunctionOverload)函數(shù)重載:一組概念相同,處理對象(參數(shù))不同的過程,出于方便編程的目的,用同一個函數(shù)名字來命名的技術稱為函數(shù)重載參數(shù)默認:一個函數(shù),既可以嚴謹和地道的調用,也可以省略參數(shù),輕靈地調用,達到此種方便編程目的的技術稱為參數(shù)默認重載與參數(shù)默認:它們都是通過參數(shù)的變化來分辨處理任務的不同.如果參數(shù)決定了不同的處理過程,則應重載,否則參數(shù)默認更簡捷一些8/8/2023237.函數(shù)重載(FunctionOverload重載是不同的函數(shù),以參數(shù)的類型,個數(shù)和順序來分辨voidprint(double);voidprint(int);voidfunc(){print(1);//voidprint(int);print(1.0);//voidprint(double);print(‘a(chǎn)’);//voidprint(int);print(3.1415f);//voidpirnt(double);}8/8/202324重載是不同的函數(shù),以參數(shù)的類型,個數(shù)和順序來分辨voidp參數(shù)默認是通過不同參數(shù)來分辨一個函數(shù)調用中的行為差異voiddelay(inta=2);//函數(shù)聲明時intma

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論