




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用目錄1.內(nèi)聯(lián)函數(shù)1.1為什么使用內(nèi)聯(lián)函數(shù)1.2語法2.引用變量2.1為什么要使用引用變量2.2語法2.3對于C語言的改進(jìn)3.函數(shù)重載3.1默認(rèn)參數(shù)3.2函數(shù)重載
1.內(nèi)聯(lián)函數(shù)
1.1為什么使用內(nèi)聯(lián)函數(shù)
減少上下文切換,加快程序運(yùn)行速度。是對C語言中的宏函數(shù)的改進(jìn)。
1.2語法
#includeiostream
usingnamespacestd;
inlinedoublesquare(doublex){
returnx*x;
intmain(){
coutsquare(2.2)endl;
}
其實(shí)就是在函數(shù)聲明或者定義前加上關(guān)鍵字inline。
2.引用變量
2.1為什么要使用引用變量
主要用途是用作函數(shù)的形參。通過引用變量做參數(shù),函數(shù)將使用原始數(shù)據(jù),而不是其副本。高效。
2.2語法
引用實(shí)際上就是定義一個(gè)別名。看看下面代碼:
#includeiostream
usingnamespacestd;
intmain(){
inta=50;
intb=a;//定義并初始化,這里b是a的引用。
cout"a:"aendl;
cout"b:"bendl;
cout"addressofa:"aendl;
cout"addressofb:"bendl;
b=100;
cout"a:"aendl;
cout"b:"bendl;
intc=200;
b=c;//試圖將b作為c的引用。行不通。
cout"a:"aendl;
cout"b:"bendl;
cout"c:"cendl;
cout"addressofa:"aendl;
cout"addressofb:"bendl;
cout"addressofc:"cendl;
}
a:50
b:50
addressofa:0x61fe14
addressofb:0x61fe14
a:100
b:100
a:200
b:200
c:200
addressofa:0x61fe14
addressofb:0x61fe14
addressofc:0x61fe10
a和b的數(shù)據(jù)地址是一樣的,這說明b相當(dāng)于a的別名,我們改變b的值,也會改變a的值,而且后面我們試圖將b轉(zhuǎn)變?yōu)閏的引用,但是行不通,b=c這個(gè)代碼做的是賦值語句,相當(dāng)于a=c.
引用和指針的區(qū)別
引用在聲明的時(shí)候必須初始化
int這句話是不允許的。
引用的本質(zhì)就是指針常量。因?yàn)橐米兞恳坏┏跏蓟筒荒芨摹?/p>
intb=a和int*constp=a這兩句中b和*p是一模一樣的。
引用作為函數(shù)參數(shù)
#includeiostream
usingnamespacestd;
voidswap(inta,intb){
intc;
c=a;
a=b;
b=c;
intmain(){
inta=2;
intb=3;
swap(a,b);
coutabendl;
}
可以看出把引用作為參數(shù)的函數(shù),只需在聲明時(shí),把參數(shù)設(shè)置成引用即可。
臨時(shí)變量
試想一下,在參數(shù)傳遞過程中,我們把常數(shù)或者錯(cuò)誤類型的實(shí)參,傳給引用參數(shù),會發(fā)生什么?這個(gè)引用參數(shù)會變成這個(gè)實(shí)參的引用嗎?顯然不會,因?yàn)槌?shù)不能修改,引用是錯(cuò)誤的,正如inta=2;會報(bào)錯(cuò)一樣;錯(cuò)誤類型的實(shí)參,也不能直接引用。
為了解決這個(gè)事,c++允許臨時(shí)變量的產(chǎn)生。但是只有const引用才會產(chǎn)生臨時(shí)變量,const引用不允許變量發(fā)生賦值。
總結(jié)來說,臨時(shí)變量的產(chǎn)生條件是,在傳參給const引用參數(shù)時(shí):
實(shí)參不是左值.(左值指的是const變量和常規(guī)變量。)
實(shí)參類型不正確且可類型轉(zhuǎn)換。
所以說,為了使得引用參數(shù)傳遞的兼容性和安全性,請多使用const。
#includeiostream
usingnamespacestd;
doublesquare(constdoublea){
returna*a*a;
intmain(){
inta=3;
coutsquare(3+a)endl;
可以看出來這里square函數(shù)可以接受非左值,類型錯(cuò)誤的實(shí)參。
你可能覺得這樣做很復(fù)雜,直接使用按值傳參就行了。doublesquare(doublea)和doublesquare(constdoublea),從效果來說,這兩一樣,但是我們使用第二種傳參的好處是高效,試想一下我們同時(shí)傳一個(gè)double類型的變量,const引用傳參不需要數(shù)據(jù)的拷貝,更快。
右值引用
采用來對右值做引用,這么做的目的是用來實(shí)現(xiàn)移動語義。
#includeiostream
usingnamespacestd;
intmain(){
doublea=3.1;
doubleb=a*1.2+2.3;
coutbendl;
b=3;
coutaendl;
coutbendl;
}
6.02
3.1
3
結(jié)構(gòu)引用
引用非常適合于結(jié)構(gòu)和類
#includeiostream
usingnamespacestd;
structapple
stringname;
doubleweight;
appleswap(applea,appleb){
appletemp;
temp=a;
a=b;
b=temp;
returna;
intmain(){
applea={"Bob",230};
appleb={"Alice",190};
swap(a,b);
cout"a:"endl"name:"endl"weight:"a.weightendlendl;
cout"b:"endl"name:"endl"weight:"b.weightendlendl;
swap(swap(a,b),b);
cout"a:"endl"name:"endl"weight:"a.weightendlendl;
cout"b:"endl"name:"endl"weight:"b.weightendlendl;
swap(swap(swap(a,b),b),b);
swap(swap(a,b),b);
cout"a:"endl"name:"endl"weight:"a.weightendlendl;
cout"b:"endl"name:"endl"weight:"b.weightendlendl;
}
a:
name:Alice
weight:190
b:
name:Bob
weight:230
a:
name:Alice
weight:190
b:
name:Bob
weight:230
a:
name:Bob
weight:230
b:
name:Alice
weight:190
swap()函數(shù)的返回值是一個(gè)引用變量,所以swap(swap(swap(a,b),b),b)是合法的,且它等價(jià)于swap(a,b)。
為何要返回引用?高效。因?yàn)閭鹘y(tǒng)返回機(jī)制,會把返回結(jié)果復(fù)制到一個(gè)臨時(shí)位置。但是應(yīng)該避免返回函數(shù)終止時(shí)不再存在的內(nèi)存單元引用。例如避免返回臨時(shí)變量的引用。
2.3對于C語言的改進(jìn)
用const引用傳參傳遞代替按值傳遞。對于要修改原始數(shù)據(jù)的函數(shù),采用引用傳參方式。
3.函數(shù)重載
3.1默認(rèn)參數(shù)
默認(rèn)參數(shù)指的是函數(shù)調(diào)用中省略了實(shí)參時(shí)自動使用的一個(gè)值。
如何設(shè)置默認(rèn)值?必須通過函數(shù)原型。例如這里的voiddisplay(inta,intn=999);這里n=999就是默認(rèn)參數(shù)默認(rèn)參數(shù)的作用是,不給這個(gè)參數(shù)傳參時(shí),他會采用默認(rèn)值。
#includeiostream
usingnamespacestd;
voiddisplay(inta,intn=999);
intmain(){
display(1);
display(3,31);
voiddisplay(inta,intn){
coutaendl;
coutnendl;
1
999
3
31
3.2函數(shù)重載
默認(rèn)參數(shù)能讓我們使用不同數(shù)目的參數(shù)調(diào)用同一個(gè)函數(shù),而函數(shù)重載能讓我們使用多個(gè)同名的函數(shù)。
函數(shù)重載的關(guān)鍵是函數(shù)的參數(shù)列表也稱函數(shù)特征標(biāo)。如果兩個(gè)函數(shù)的名字和特征標(biāo)相同,那么這兩個(gè)函數(shù)就完全相同。C++允許定義名稱相同,函數(shù)特征標(biāo)不同的函數(shù),這就是所謂的函數(shù)重載。
#includeiostream
usingnamespacestd;
structapple{
stringname;
doubleweight;
voidprint(int);
voidprint(double);
voidprint(char*);
voidprint(applea,stringstr="apple",doublew=100);
intmain(){
inta=2;
doubleb=3.14;
charc[10]="hello!";
appled;
print(a);
print(b);
print(c);
print(d);
print(d,"Alice",250);
voidprint(inta){
cout"int="aendl;
voidprint(doublea){
cout"double="aendl;
voidprint(char*a){
cout"char*="aendl;
voidprint(applea,stringstr,doubleb){
=str;
a.weight=b;
cout"thename:"endl;
cout"theweight:"a.weightendl;
}
int=2
double=3.14
char*=hello!
thename:apple
theweight:100
thename:Alice
theweight:250
可以看出來print函數(shù)有多個(gè)重載,現(xiàn)代編譯器會根據(jù)你傳遞的參數(shù)類型,而選擇最匹配的函數(shù)。
關(guān)于函數(shù)重載的一些細(xì)節(jié)
類型引用和類型本身視為同一個(gè)特征標(biāo),例如doublecube(doublex);和doublecube(double是不能共存的。匹配函數(shù)時(shí),會區(qū)分const和非const變量,例如voiddisplay(char*a);和voiddisplay(constchar*a);是函數(shù)重載。請記住是特征標(biāo),而不是函數(shù)類型使得可以對函數(shù)進(jìn)行重載。例如longgronk(int,float);和doublegronk(int,float);是不能共存的。
函數(shù)重載的shortcoming
函數(shù)重載在實(shí)現(xiàn)同函數(shù)名多種功能的同時(shí),也應(yīng)當(dāng)付出代價(jià)。
標(biāo)準(zhǔn)類型轉(zhuǎn)化、強(qiáng)制匹配能力下降。
#includeiostream
usingnamespacestd;
voidprint(double);
voidprint(char*);
intmain(){
inta=2;
doubleb=3.14;
charc[10]="hello!";
print(a);
print(b);
print(c);
voidprint(doublea){
cout"double="aendl;
voidprint(char*a){
cout"char*="aendl;
}
double=2
double=3.14
c
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學(xué)助教培訓(xùn)心得體會范文
- 高校教師師德師風(fēng)建設(shè)意見學(xué)習(xí)心得體會
- 小學(xué)一年級運(yùn)動健康教育計(jì)劃
- 城市建設(shè)工程服務(wù)安全措施
- 金融服務(wù)擬投入主要物資計(jì)劃
- 學(xué)校師德師風(fēng)培訓(xùn)實(shí)施計(jì)劃
- 七年級信息化勞動技術(shù)教學(xué)計(jì)劃他
- 2025兒童口腔護(hù)理專項(xiàng)計(jì)劃
- 高一下學(xué)期年級部課外輔導(dǎo)計(jì)劃
- 手工制作興趣小組時(shí)尚設(shè)計(jì)活動計(jì)劃
- 新校區(qū)搬遷活動方案
- 2025年威海市中考數(shù)學(xué)試卷真題(含答案解析)
- 2025至2030中國綠色建筑材料行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 國家開放大學(xué)機(jī)考答案4人力資源管理2025-06-21
- 病理生物安全管理制度
- 系統(tǒng)性紅斑狼瘡護(hù)理要點(diǎn)講課件
- 急性呼吸衰竭教學(xué)
- 土地執(zhí)法知識課件
- 信息分級分類管理制度
- 2022包頭輕工職業(yè)技術(shù)學(xué)院招聘筆試真題含答案詳解
- 畢業(yè)設(shè)計(jì)(論文)-自動展開曬衣架設(shè)計(jì)
評論
0/150
提交評論