![三內(nèi)聯(lián)函數(shù)inlinefunction四引用和數(shù)值傳遞方式具體_第1頁(yè)](http://file4.renrendoc.com/view11/M03/31/0B/wKhkGWWdwweASxImAADRXOGxO4U030.jpg)
![三內(nèi)聯(lián)函數(shù)inlinefunction四引用和數(shù)值傳遞方式具體_第2頁(yè)](http://file4.renrendoc.com/view11/M03/31/0B/wKhkGWWdwweASxImAADRXOGxO4U0302.jpg)
![三內(nèi)聯(lián)函數(shù)inlinefunction四引用和數(shù)值傳遞方式具體_第3頁(yè)](http://file4.renrendoc.com/view11/M03/31/0B/wKhkGWWdwweASxImAADRXOGxO4U0303.jpg)
![三內(nèi)聯(lián)函數(shù)inlinefunction四引用和數(shù)值傳遞方式具體_第4頁(yè)](http://file4.renrendoc.com/view11/M03/31/0B/wKhkGWWdwweASxImAADRXOGxO4U0304.jpg)
![三內(nèi)聯(lián)函數(shù)inlinefunction四引用和數(shù)值傳遞方式具體_第5頁(yè)](http://file4.renrendoc.com/view11/M03/31/0B/wKhkGWWdwweASxImAADRXOGxO4U0305.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
三、內(nèi)聯(lián)函數(shù)(inlinefunction)
四、引用和數(shù)值傳遞方式具體比較第8章函數(shù)1三、內(nèi)聯(lián)函數(shù)(inlinefunction)C++(C99)新增的關(guān)鍵字inline修飾的函數(shù)稱為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)的語(yǔ)法格式與普通函數(shù)一樣,只是在函數(shù)原型或函數(shù)定義的標(biāo)題頭之前加上關(guān)鍵字inline。格式為:
inlinetypefunction(type1parm1,type1parm2,...
typen
parmn){語(yǔ)句序列;}
關(guān)鍵字inline通知編譯器用內(nèi)聯(lián)函數(shù)體中的函數(shù)代碼在虛實(shí)結(jié)合的時(shí)候取代函數(shù)調(diào)用,調(diào)用一次就替換一次。這種替換經(jīng)過(guò)參量之間類型匹配合適性的檢查。內(nèi)聯(lián)函數(shù)虛實(shí)結(jié)合處發(fā)生的替換稱為內(nèi)聯(lián)展開,內(nèi)聯(lián)展開的結(jié)果是程序代碼的擴(kuò)大但執(zhí)行的時(shí)間減少?gòu)亩授吙臁?關(guān)鍵字inline是對(duì)編譯器的優(yōu)化建議,通常只是對(duì)于短小的函數(shù)才執(zhí)行了實(shí)際的函數(shù)體代碼替換。內(nèi)聯(lián)函數(shù)力圖減少函數(shù)調(diào)用的堆??臻g之間的調(diào)轉(zhuǎn)損耗。遞歸函數(shù)、可變參量的函數(shù)以及涉及到復(fù)雜指針運(yùn)算的函數(shù)難以內(nèi)聯(lián)展開。 編譯器對(duì)于inline展開采取復(fù)雜的指標(biāo),一旦滿足這些指標(biāo),真實(shí)的擴(kuò)展在函數(shù)的調(diào)用點(diǎn)進(jìn)行。為便于內(nèi)聯(lián)函數(shù)的真實(shí)展開,inline函數(shù)的定義一般應(yīng)放置在調(diào)用點(diǎn)之前。
C++引入inline函數(shù)的原因一是破除private或protected關(guān)鍵字導(dǎo)致的封裝弊端,二是減少宏展開的副作用。宏展開是由#define預(yù)處理指令引入的代碼重用的機(jī)制。3[例]swap函數(shù)僅交換函數(shù)[例]
內(nèi)層塊交換內(nèi)層局部局部變量的值變量的值#include<stdio.h>#include<stdio.h>inlinevoidswap(int
x,inty)voidmain(void){intt=x;x=y;y=t;{inta=1,b=2;
printf("%d,%d;",x,y);}{intx=a;inty=b;voidmain(void)intt=x;x=y;y=t;{inta=1,b=2;printf("%d,%d;",x,y);}swap(a,b);//內(nèi)層塊是swap(a,b)的內(nèi)聯(lián)展開
printf("%d,%d\n",a,b);}
printf("%d,%d\n",a,b);}
輸出結(jié)果都為2,1;1,2,可見(jiàn)函數(shù)體中形參的變化不影響實(shí)參變量。4下面兩個(gè)程序中的swap函數(shù)交換間接變量的值都輸出1,22,1[例]
指針的數(shù)值形參交換間接變量
#include<stdio.h>inlinevoidswap(int*x,int*y){printf("%d,%d",*x,*y);
intt=*x;*x=*y;*y=t;} voidmain(void){inta=1,b=2; swap(&a,&b);
printf("%d,%d\",a,b); }5[例]
內(nèi)層塊交換間接變量的值
#include<stdio.h>voidmain(void)//左邊代碼的內(nèi)聯(lián)展開
{inta=1,b=2;{int*y=&b;
int*x=&a;
printf("%d,%d",*x,*y);
intt=*x;*x=*y;*y=t; }//內(nèi)層塊是swap(&a,&b)的內(nèi)聯(lián)展開
printf("%d,%d",a,b); }6考慮到*(&Lvalue)=Lvalue,上面程序的swap函數(shù)調(diào)用具體運(yùn)算步驟可理解為:
函數(shù)調(diào)用swap(&a,&b)觸發(fā)虛實(shí)結(jié)合:
int*x=&a;int*y=&b;
進(jìn)入函數(shù)體:
{intt=*x;*x=*y;*y=t;}
帶實(shí)參值參入運(yùn)算:
x=&a;y=&b;{t=*(&a);*(&a)=*(&b);*(&b)=t}
{t=a;a=b;b=t}
運(yùn)算完畢從被調(diào)函數(shù)返回。7在函數(shù)調(diào)用時(shí),指針x指向變量a,*x是變量a的間接變量。對(duì)于間接變量*x的操作就是對(duì)于變量a的等價(jià)操作。指針y指向變量b,*y是變量b的間接變量。對(duì)于間接變量*y的操作就是對(duì)于變量b的等價(jià)操作。通過(guò)訪問(wèn)指針形參可以改變主控函數(shù)變量的值。8四、引用和數(shù)值傳遞方式具體比較在C++中參數(shù)傳遞方式分為兩種:數(shù)值傳遞方式,引用傳遞方式。差別在于: 引用形參可改變實(shí)參變量,數(shù)值形參不改變同類型或同級(jí)別的實(shí)參變量。但訪問(wèn)指針數(shù)值形參可以改變指針形參指向的主控函數(shù)的變量,這是間接改變。 數(shù)值形參對(duì)應(yīng)右值實(shí)參,從實(shí)參獲得初值。引用形參匹配左值實(shí)參。左值可作為右值,右值不作為左值。9[例]
函數(shù)f返回n的立方,引用形參x計(jì)算正方形周長(zhǎng),訪問(wèn)指針*p得到正方形面積#include<stdio.h>//函數(shù)調(diào)用z=f(x,&y,3)導(dǎo)致x=4*3,*(&y)=3*3,z=3*3*3intf(int&r,int*p,intn)//引用形參r匹配左值x,指針數(shù)值形參p匹配右值地址&y{r=4*n;*p=n*n;returnn*n*n; }//變量數(shù)值形參n匹配右值3voidmain() {int
x,y,z;z=f(x,&y,3);
printf("%d,%d,%d\n",x,y,z);}//輸出:12,9,2710[例]
交換變量值的函數(shù)。以下三個(gè)程序運(yùn)行都輸出:1,2;2,1[1]
指針的數(shù)值形參版本#include<stdio.h>voidswap(int*x,int*y){printf("%d,%d;",*x,*y);
intt=*x;*x=*y;*y=t;} voidmain(void){inta=1,b=2;swap(&a,&b);
printf("%d,%d",a,b);}11[2]
變量的引用形參版本
#include<stdio.h>voidswap(int&x,int&y){printf("%d,%d;",x,y);
intt=x;x=y;y=t;}voidmain(void){inta=1,b=2;
swap(a,b);
printf("%d,%d",a,b);}12[3]
相當(dāng)于引用版本的內(nèi)聯(lián)展開#include<stdio.h>voidmain(void){inta=1,b=2;{int&y=b;
int&x=a;
printf("%d,%d;",x,y);
intt=x;x=y;y=t; }//swap(a,b)的內(nèi)聯(lián)展開
printf("%d,%d",a,b);}13指針的傳值調(diào)用與變量的引用調(diào)用在上面的例題中具有相同的作用,站在匯編語(yǔ)言的角度看實(shí)際上兩者是等價(jià)的。變量的引用傳遞其數(shù)據(jù)的流通機(jī)制本質(zhì)上同等于指針固定尋址的數(shù)值調(diào)用,根據(jù)兼容C的CFRONT策略變量的引用形參版本幕后轉(zhuǎn)換為指針的數(shù)值形參版本。嚴(yán)格地引用形參版本voidswap(int&x,int&y){intt=x;x=y;y=t;}概念上對(duì)應(yīng)或映射指針的固定尋址版本即
voidswap(int*constx,int
*consty){intt=*x;*x=*y;*y=t;}14上面前兩個(gè)版本執(zhí)行文件的大小是一樣的。表面不同的是:指針的傳值調(diào)用中x是指針,作為指針的x可以在程序段中指向不同的變量,函數(shù)中采用明朗的間接訪問(wèn)指針形式。變量的引用傳遞中x在一個(gè)程序段中僅與一個(gè)變量相關(guān)聯(lián),x隱約地對(duì)應(yīng)相關(guān)變量的地址,采用的是變量名的語(yǔ)法。注意:
voidf(int&)與voidf(int*)在實(shí)參的匹配上是不同的。voidf(int&)匹配int型的左值,voidf(int*)匹配int*型的地址表達(dá)式(右值)。15[例]求函數(shù)極大值[1]double*型指針輸入和指針?lè)祷?/p>
#include<stdio.h>double*pmax(double*x,double*y){ if(*x>*y)returnx;elsereturny;}voidmain(void){doublex=100,y=0;*pmax(&x,&y)+=100;
printf("x=%f,y=%f\n",x,y);}//程序輸出:x=200.000000,y=0.00000016[例]求函數(shù)極大值[2]double&型引用輸入和引用返回
#include<stdio.h>double&rmax(double&x,double&y){ if(x>y)returnx;elsereturny;}voidmain(void){doublex=100,y=0;
rmax(x,y)+=100;
printf("x=%f,y=%f\n",x,y);}//程序輸出:x=200.000000,y=0.00000017說(shuō)明:
[1]例題是雙重傳值,函數(shù)的輸入傳值,函數(shù)的返回也是傳值,操作的變量是double*型的指針。pmax(&x,&y)是double*型的右值,*pmax(&x,&y)是double型的左值。
[2]例題是函數(shù)的引用輸入與引用返回。兩者實(shí)現(xiàn)相同的功能,但引用語(yǔ)法略微簡(jiǎn)潔。根據(jù)兼容C的CFRONT策略,右邊的代碼在幕后處理為左邊的代碼,然后轉(zhuǎn)換匯編
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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年烈士陵園、紀(jì)念館服務(wù)合作協(xié)議書
- 2025年新型膜材料及其裝置合作協(xié)議書
- 人教版 八年級(jí)英語(yǔ)下冊(cè) Unit 5 單元綜合測(cè)試卷(2025年春)
- 2024-2025學(xué)年江蘇省南通市如皋市四年級(jí)(上)期末數(shù)學(xué)試卷
- 2025年電調(diào)收音機(jī)合作協(xié)議書
- 2025年京巴犬買賣合同范文(2篇)
- 2025年個(gè)體勞動(dòng)合同常用版(2篇)
- 2025年中學(xué)餐廳承包協(xié)議(2篇)
- 2025年人教版小學(xué)五年級(jí)上冊(cè)數(shù)學(xué)教學(xué)工作總結(jié)范例(二篇)
- 2025年九年級(jí)教學(xué)管理工作總結(jié)模版(2篇)
- 《發(fā)展?jié)h語(yǔ)(第二版)中級(jí)綜合(Ⅰ)》第9課+課件
- 2023-2024學(xué)年四川省成都市小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)期末提升試題
- GB/T 7462-1994表面活性劑發(fā)泡力的測(cè)定改進(jìn)Ross-Miles法
- GB/T 2934-2007聯(lián)運(yùn)通用平托盤主要尺寸及公差
- GB/T 21709.13-2013針灸技術(shù)操作規(guī)范第13部分:芒針
- 2022年青島職業(yè)技術(shù)學(xué)院?jiǎn)握姓Z(yǔ)文考試試題及答案解析
- 急診科進(jìn)修匯報(bào)課件
- DL∕T 617-2019 氣體絕緣金屬封閉開關(guān)設(shè)備技術(shù)條件
- 一年級(jí)家訪記錄表(常用)
- 信息技術(shù)基礎(chǔ)ppt課件(完整版)
- 電子課件-《飯店服務(wù)心理(第四版)》-A11-2549
評(píng)論
0/150
提交評(píng)論