一、引用作為函式引數
作為函式引數時引用有兩種原因:
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...