C++示例分析內聯(lián)函數與引用變量及函數重載的使用_第1頁
C++示例分析內聯(lián)函數與引用變量及函數重載的使用_第2頁
C++示例分析內聯(lián)函數與引用變量及函數重載的使用_第3頁
C++示例分析內聯(lián)函數與引用變量及函數重載的使用_第4頁
C++示例分析內聯(lián)函數與引用變量及函數重載的使用_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第C++示例分析內聯(lián)函數與引用變量及函數重載的使用目錄1.內聯(lián)函數1.1為什么使用內聯(lián)函數1.2語法2.引用變量2.1為什么要使用引用變量2.2語法2.3對于C語言的改進3.函數重載3.1默認參數3.2函數重載

1.內聯(lián)函數

1.1為什么使用內聯(lián)函數

減少上下文切換,加快程序運行速度。是對C語言中的宏函數的改進。

1.2語法

#includeiostream

usingnamespacestd;

inlinedoublesquare(doublex){

returnx*x;

intmain(){

coutsquare(2.2)endl;

}

其實就是在函數聲明或者定義前加上關鍵字inline。

2.引用變量

2.1為什么要使用引用變量

主要用途是用作函數的形參。通過引用變量做參數,函數將使用原始數據,而不是其副本。高效。

2.2語法

引用實際上就是定義一個別名??纯聪旅娲a:

#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的數據地址是一樣的,這說明b相當于a的別名,我們改變b的值,也會改變a的值,而且后面我們試圖將b轉變?yōu)閏的引用,但是行不通,b=c這個代碼做的是賦值語句,相當于a=c.

引用和指針的區(qū)別

引用在聲明的時候必須初始化

int這句話是不允許的。

引用的本質就是指針常量。因為引用變量一旦初始化就不能更改。

intb=a和int*constp=a這兩句中b和*p是一模一樣的。

引用作為函數參數

#includeiostream

usingnamespacestd;

voidswap(inta,intb){

intc;

c=a;

a=b;

b=c;

intmain(){

inta=2;

intb=3;

swap(a,b);

coutabendl;

}

可以看出把引用作為參數的函數,只需在聲明時,把參數設置成引用即可。

臨時變量

試想一下,在參數傳遞過程中,我們把常數或者錯誤類型的實參,傳給引用參數,會發(fā)生什么?這個引用參數會變成這個實參的引用嗎?顯然不會,因為常數不能修改,引用是錯誤的,正如inta=2;會報錯一樣;錯誤類型的實參,也不能直接引用。

為了解決這個事,c++允許臨時變量的產生。但是只有const引用才會產生臨時變量,const引用不允許變量發(fā)生賦值。

總結來說,臨時變量的產生條件是,在傳參給const引用參數時:

實參不是左值.(左值指的是const變量和常規(guī)變量。)

實參類型不正確且可類型轉換。

所以說,為了使得引用參數傳遞的兼容性和安全性,請多使用const。

#includeiostream

usingnamespacestd;

doublesquare(constdoublea){

returna*a*a;

intmain(){

inta=3;

coutsquare(3+a)endl;

可以看出來這里square函數可以接受非左值,類型錯誤的實參。

你可能覺得這樣做很復雜,直接使用按值傳參就行了。doublesquare(doublea)和doublesquare(constdoublea),從效果來說,這兩一樣,但是我們使用第二種傳參的好處是高效,試想一下我們同時傳一個double類型的變量,const引用傳參不需要數據的拷貝,更快。

右值引用

采用來對右值做引用,這么做的目的是用來實現移動語義。

#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()函數的返回值是一個引用變量,所以swap(swap(swap(a,b),b),b)是合法的,且它等價于swap(a,b)。

為何要返回引用?高效。因為傳統(tǒng)返回機制,會把返回結果復制到一個臨時位置。但是應該避免返回函數終止時不再存在的內存單元引用。例如避免返回臨時變量的引用。

2.3對于C語言的改進

用const引用傳參傳遞代替按值傳遞。對于要修改原始數據的函數,采用引用傳參方式。

3.函數重載

3.1默認參數

默認參數指的是函數調用中省略了實參時自動使用的一個值。

如何設置默認值?必須通過函數原型。例如這里的voiddisplay(inta,intn=999);這里n=999就是默認參數默認參數的作用是,不給這個參數傳參時,他會采用默認值。

#includeiostream

usingnamespacestd;

voiddisplay(inta,intn=999);

intmain(){

display(1);

display(3,31);

voiddisplay(inta,intn){

coutaendl;

coutnendl;

1

999

3

31

3.2函數重載

默認參數能讓我們使用不同數目的參數調用同一個函數,而函數重載能讓我們使用多個同名的函數。

函數重載的關鍵是函數的參數列表也稱函數特征標。如果兩個函數的名字和特征標相同,那么這兩個函數就完全相同。C++允許定義名稱相同,函數特征標不同的函數,這就是所謂的函數重載。

#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函數有多個重載,現代編譯器會根據你傳遞的參數類型,而選擇最匹配的函數。

關于函數重載的一些細節(jié)

類型引用和類型本身視為同一個特征標,例如doublecube(doublex);和doublecube(double是不能共存的。匹配函數時,會區(qū)分const和非const變量,例如voiddisplay(char*a);和voiddisplay(constchar*a);是函數重載。請記住是特征標,而不是函數類型使得可以對函數進行重載。例如longgronk(int,float);和doublegronk(int,float);是不能共存的。

函數重載的shortcoming

函數重載在實現同函數名多種功能的同時,也應當付出代價。

標準類型轉化、強制匹配能力下降。

#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壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論