「引用作為函式引數」與 「引用作為函式返回值」

2021-08-26 12:35:13 字數 2029 閱讀 2368

一、引用作為函式引數

作為函式引數時引用有兩種原因:

1、在函式內部會對此引數進行修改;

2、提高函式呼叫和執行效率。

關於第一點,都知道

c++裡提到函式就會提到形參和實參。如果函式的引數實質就是形參,不過這個形參的作用域只是在函式體內部,也就是說實參和形參是兩個不同的東西,要想形參代替實參,肯定有乙個值的傳遞。函式呼叫時,值的傳遞機制是通過「形參

=實參」來對形參賦值達到傳值目的,產生了乙個實參的副本。即使函式內部有對引數的修改,也只是針對形參,也就是那個副本,實參不會有任何更改。函式一旦結束,形參生命也宣告終結,做出的修改一樣沒對任何變數產生影響。

例如:

void swap(int p1, int p2) //對兩個變數進行交換處理。此處函式的形參為p1, p2,沒有引用

void main( )

你會發現輸出的a和

b還是你輸入的值,沒有交換。

如果我們改為:

void swap(int &p1, int &p2) //對兩個變數進行交換處理。此處函式的形參為p1, p2都是引用

再次執行,就會發現值交換了。

原理就在於採用

&p1和

&p2時,p1和

p2是實參的別名而已,像乙個指標指向實參。改變p1和

p2就是改變實參的值。

關於第二點,可以結合第一點分析,p1和

p2是實參的引用,不用經過值的傳遞機制,已經有了實參值的資訊。所以沒有了傳值和生成副本的時間和空間消耗。當程式對效率要求比較高時,這是非常必要的.

二、引用作為函式返回值

說明: (1

)以引用返回函式值,定義函式時需要在函式名前加&

(2)用引用返回乙個函式值的最大好處是,在記憶體中不產生被返回值的副本。

例如:#include float temp; //定義全域性變數temp

float fn1(float r); //宣告函式fn1

float &fn2(float r); //宣告函式fn2

float fn1(float r) //定義函式fn1,它以返回值的方法返回函式值

float &fn2(float r) //定義函式fn2,它以引用方式返回函式值

void main() //主函式

{ float a=fn1(10.0); //第1種情況,系統生成要返回值的副本(即臨時變數)

float &b=fn1(10.0); //第2種情況,可能會出錯(不同 c++系統有不同規定)

//不能從被調函式中返回乙個臨時變數或區域性變數的引用

float c=fn2(10.0); //第3種情況,系統不生成返回值的副本

//可以從被調函式中返回乙個全域性變數的引用

float &d=fn2(10.0); //第4種情況,系統不生成返回值的副本

//可以從被調函式中返回乙個全域性變數的引用

cout《引用作為返回值,必須遵守以下規則: (

1)不能返回區域性變數的引用。主要原因是區域性變數會在函式返回後被銷毀,因此被返回的引用就成為了

"無所指

"的引用,程式會進入未知狀態。 (

2)不能返回函式內部

new分配的記憶體的引用。雖然不存在區域性變數的被動銷毀問題,可對於這種情況(返回函式內部

new分配記憶體的引用),又面臨其它尷尬局面。例如,被函式返回的引用只是作為一

個臨時變數出現,而沒有被賦予乙個實際的變數,那麼這個引用所指向的空間(由

new分配)就無法釋放,造成

memory leak。

(3)可以返回類成員的引用,但最好是

const

。主要原因是當物件的屬性是與某種業務規則(

business rule

)相關聯的時候,其賦值常常與某些其它屬性或者物件的狀態有關,因此有必要將賦值操作封裝在乙個業務規則當中。如果其它物件可以獲得該屬性的非常

量引用(或指標),那麼對該屬性的單純賦值就會破壞業務規則的完整性。

C 引用作為函式引數

有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能。到目前為止我們介紹過函式引數傳遞的兩種情況。1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實...

C 引用作為函式引數

有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能。一下是三種函式傳遞情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實參不是同乙個儲存單元...

C 引用作為函式引數

c c 入門教程 c 指標 上一節 下一節 分享到 qq空間 豆瓣 人人網 width 728 height 90 frameborder 0 marginwidth 0 marginheight 0 vspace 0 hspace 0 allowtransparency true scrollin...