深入剖析C++中的引用變量(&)

1,函數的參數傳遞方式

1️⃣實參和形參

函數的參數分爲形參(parameters)和實參(arguments)。在閱讀英文註釋或者查看英文網站的時候,可能常常會遇到這兩個單詞,應當知曉它們的區別。前者是在函數定義的時候採用的變量名,並沒有什麼實際的意義。後者則是在函數調用的時候實際傳入的參數。

2️⃣值傳遞、指針傳遞與引用傳遞

函數的參數傳遞方式可以分爲值傳遞、指針傳遞和引用傳遞。

若採用值傳遞的方式,不論傳進去的參數在函數體內執行了什麼操作,都不會影響實參本身的值,因此,如果在函數執行完畢之後打印該變量的值得話,得到的依然是進入函數體之前的值。這是因爲,實參傳進來之後,函數體會創造這些實參的副本,生成一些臨時變量,而這些臨時變量會在函數執行完之後自動釋放內存空間。

本質上來說,指針傳遞也是值傳遞,但是因爲對實參變量的地址改動了,因此執行解引用操作,對應的值也會發生變化。

如果採用引用傳遞的方式,即將引用變量作爲函數參數傳入到函數體中,函數將使用其原始數據,而不是其副本。

2,引用變量的創建

int study;
int & learn = study;

learn被稱爲study的引用,相當於別名(alias),二者擁有相同的地址,因此,二者在使用過程中具有同等效力,learn++,相應的study的值也會加1。對於C語言的用戶而言,可能會疑惑其與指針的區別,實際上,上述代碼等價於

int * const learn = & study

但是,與指針不同的是,引用在聲明的同時,必須將其初始化。

還要注意以下代碼:

int rats = 101;
int * pt = & rats;
int & rodents = * pt;
int bunnies = 50;
pt = & bunnies;

即使後來pt指向了bunnies,但是rodents初始化爲*pt使得rodents成爲了rats的別名,因此,無論pt如何變化,只要rats的值不變,都不會改變rodents的值。

3,引用變量作爲函數的參數

引用作爲函數的參數,是C++相對於C語言的超越。如果所編寫的函數使用基本的數值類型,那麼建議採用值傳遞的方式,當數據比較大(如結構和類)時,引用參數將很有用,引用也主要是爲了這些類型設計的。

當引用作爲函數參數時,如果實參與引用參數不匹配,C++將生成臨時變量,當且僅當參數爲const引用時,C++才允許這樣做。

左值參數時可以被引用的數據對象。在C語言中,左值最初指的是可出現在賦值語句左邊的實體,但這是引入關鍵字const之前的情況。現在,常規變量和const變量都可以視爲左值,因爲可以通過地址去訪問它們。但常規變量屬於可修改的左值,而const變量屬於不可修改的左值。

double &&rref = std::sqrt(36.00);
double j = 15.0;
double && jref = 2.0 * j + 18.5;

C++11新增了另一種引用--右值引用(rvalue reference),這種引用可以指向右值,是使用&&聲明的。新增右值引用的主要目的是,讓庫設計人員能夠提供有些操作的更有效實現。以前的引用(使用&聲明的引用)現在稱爲左值引用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章