




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第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語言的改進3.函數(shù)重載3.1默認參數(shù)3.2函數(shù)重載
1.內(nèi)聯(lián)函數(shù)
1.1為什么使用內(nèi)聯(lián)函數(shù)
減少上下文切換,加快程序運行速度。是對C語言中的宏函數(shù)的改進。
1.2語法
#includeiostream
usingnamespacestd;
inlinedoublesquare(doublex){
returnx*x;
intmain(){
coutsquare(2.2)endl;
}
其實就是在函數(shù)聲明或者定義前加上關鍵字inline。
2.引用變量
2.1為什么要使用引用變量
主要用途是用作函數(shù)的形參。通過引用變量做參數(shù),函數(shù)將使用原始數(shù)據(jù),而不是其副本。高效。
2.2語法
引用實際上就是定義一個別名。看看下面代碼:
#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相當于a的別名,我們改變b的值,也會改變a的值,而且后面我們試圖將b轉(zhuǎn)變?yōu)閏的引用,但是行不通,b=c這個代碼做的是賦值語句,相當于a=c.
引用和指針的區(qū)別
引用在聲明的時候必須初始化
int這句話是不允許的。
引用的本質(zhì)就是指針常量。因為引用變量一旦初始化就不能更改。
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ù),會發(fā)生什么?這個引用參數(shù)會變成這個實參的引用嗎?顯然不會,因為常數(shù)不能修改,引用是錯誤的,正如inta=2;會報錯一樣;錯誤類型的實參,也不能直接引用。
為了解決這個事,c++允許臨時變量的產(chǎn)生。但是只有const引用才會產(chǎn)生臨時變量,const引用不允許變量發(fā)生賦值。
總結來說,臨時變量的產(chǎn)生條件是,在傳參給const引用參數(shù)時:
實參不是左值.(左值指的是const變量和常規(guī)變量。)
實參類型不正確且可類型轉(zhuǎn)換。
所以說,為了使得引用參數(shù)傳遞的兼容性和安全性,請多使用const。
#includeiostream
usingnamespacestd;
doublesquare(constdoublea){
returna*a*a;
intmain(){
inta=3;
coutsquare(3+a)endl;
可以看出來這里square函數(shù)可以接受非左值,類型錯誤的實參。
你可能覺得這樣做很復雜,直接使用按值傳參就行了。doublesquare(doublea)和doublesquare(constdoublea),從效果來說,這兩一樣,但是我們使用第二種傳參的好處是高效,試想一下我們同時傳一個double類型的變量,const引用傳參不需要數(shù)據(jù)的拷貝,更快。
右值引用
采用來對右值做引用,這么做的目的是用來實現(xiàn)移動語義。
#includeiostream
usingnamespacestd;
intmain(){
doublea=3.1;
doubleb=a*1.2+2.3;
coutbendl;
b=3;
coutaendl;
coutbendl;
}
6.02
3.1
3
結構引用
引用非常適合于結構和類
#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ù)的返回值是一個引用變量,所以swap(swap(swap(a,b),b),b)是合法的,且它等價于swap(a,b)。
為何要返回引用?高效。因為傳統(tǒng)返回機制,會把返回結果復制到一個臨時位置。但是應該避免返回函數(shù)終止時不再存在的內(nèi)存單元引用。例如避免返回臨時變量的引用。
2.3對于C語言的改進
用const引用傳參傳遞代替按值傳遞。對于要修改原始數(shù)據(jù)的函數(shù),采用引用傳參方式。
3.函數(shù)重載
3.1默認參數(shù)
默認參數(shù)指的是函數(shù)調(diào)用中省略了實參時自動使用的一個值。
如何設置默認值?必須通過函數(shù)原型。例如這里的voiddisplay(inta,intn=999);這里n=999就是默認參數(shù)默認參數(shù)的作用是,不給這個參數(shù)傳參時,他會采用默認值。
#includeiostream
usingnamespacestd;
voiddisplay(inta,intn=999);
intmain(){
display(1);
display(3,31);
voiddisplay(inta,intn){
coutaendl;
coutnendl;
1
999
3
31
3.2函數(shù)重載
默認參數(shù)能讓我們使用不同數(shù)目的參數(shù)調(diào)用同一個函數(shù),而函數(shù)重載能讓我們使用多個同名的函數(shù)。
函數(shù)重載的關鍵是函數(shù)的參數(shù)列表也稱函數(shù)特征標。如果兩個函數(shù)的名字和特征標相同,那么這兩個函數(shù)就完全相同。C++允許定義名稱相同,函數(shù)特征標不同的函數(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ù)有多個重載,現(xiàn)代編譯器會根據(jù)你傳遞的參數(shù)類型,而選擇最匹配的函數(shù)。
關于函數(shù)重載的一些細節(jié)
類型引用和類型本身視為同一個特征標,例如doublecube(doublex);和doublecube(double是不能共存的。匹配函數(shù)時,會區(qū)分const和非const變量,例如voiddisplay(char*a);和voiddisplay(constchar*a);是函數(shù)重載。請記住是特征標,而不是函數(shù)類型使得可以對函數(shù)進行重載。例如longgronk(int,float);和doublegronk(int,float);是不能共存的。
函數(shù)重載的shortcoming
函數(shù)重載在實現(xiàn)同函數(shù)名多種功能的同時,也應當付出代價。
標準類型轉(zhuǎn)化、強制匹配能力下降。
#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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項目合作共建及知識產(chǎn)權分配協(xié)議
- 電商平臺數(shù)據(jù)分析與優(yōu)化協(xié)議
- 環(huán)保節(jié)能LED照明工程協(xié)議
- 國際技術合作項目書協(xié)議
- 利用農(nóng)業(yè)信息技術提升農(nóng)業(yè)發(fā)展合作協(xié)議
- 二零二五年度機場跑道燈光系統(tǒng)安裝總承包合同
- 二零二五年度跨境貿(mào)易財產(chǎn)保全擔保合同范本
- 二零二五版家政玻璃清潔保養(yǎng)服務規(guī)范協(xié)議
- 2025版汽車租賃與車輛租賃解除協(xié)議
- 2025年工業(yè)互聯(lián)網(wǎng)平臺網(wǎng)絡流量整形技術在工業(yè)互聯(lián)網(wǎng)平臺產(chǎn)業(yè)創(chuàng)新生態(tài)構建中的應用報告
- 五升六數(shù)學暑假作業(yè)每日一練打印練習
- 2025年入黨考試題及答案
- 低空經(jīng)濟專題系列報告四:無人機與低空物流:擁抱無人物流時代
- 新校區(qū)搬遷活動方案
- 2025SYB創(chuàng)業(yè)考試題庫及答案
- 新鄉(xiāng)市縣以下事業(yè)單位聯(lián)考招聘筆試真題2024
- 中醫(yī)體驗活動方案
- 培智學生XXX個別化教育手冊
- AWG,SWG,BWG線規(guī)規(guī)格對照表
- 《房屋面積測算技術規(guī)程》DGJ32TJ131-2022
- (整理)小學數(shù)獨游戲校本課程教材.
評論
0/150
提交評論