函式的引數分為形參(parameters)和實參(arguments)。在閱讀英文注釋或者檢視英文**的時候,可能常常會遇到這兩個單詞,應當知曉它們的區別。前者是在函式定義的時候採用的變數名,並沒有什麼實際的意義。後者則是在函式呼叫的時候實際傳入的引數。
函式的引數傳遞方式可以分為值傳遞、指標傳遞和引用傳遞。
若採用值傳遞的方式,不論傳進去的引數在函式體內執行了什麼操作,都不會影響實參本身的值,因此,如果在函式執行完畢之後列印該變數的值得話,得到的依然是進入函式體之前的值。這是因為,實參傳進來之後,函式體會創造這些實參的副本,生成一些臨時變數,而這些臨時變數會在函式執行完之後自動釋放記憶體空間。
本質上來說,指標傳遞也是值傳遞,但是因為對實參變數的位址改動了,因此執行解引用操作,對應的值也會發生變化。
如果採用引用傳遞的方式,即將引用變數作為函式引數傳入到函式體中,函式將使用其原始資料,而不是其副本。
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的值。
引用作為函式的引數,是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),這種引用可以指向右值,是使用&&宣告的。新增右值引用的主要目的是,讓庫設計人員能夠提供有些操作的更有效實現。以前的引用(使用&宣告的引用)現在稱為左值引用。 c 引用引數傳遞的深入剖析
在c 中,資料有2中基本型別 值型別和引用型別 值型別的變數儲存資料,而引用型別的變數儲存對實際資料的引用。在引數傳遞時,值型別是以值的形式傳遞的,是將要傳遞的引數的值複製給函式的形參,因此在函式體類對於該形參的任何改變都不會影響原來的值 引用型別是以物件引用的形式傳遞的,是將要傳遞的物件的引用複製...
C 中的引用剖析
在c語言中,對於下面兩個實現交換變數值的函式,因為函式傳參傳的是函式值,swap1 是完成不了的,而swap2 可以。include void swap1 int a,int b void swap2 int pa,int pb intmain int argc,char ar 執行結果 初始時a ...
C 中虛函式深入剖析
虛函式 虛函式 虛函式位址表 虛表 vtable 每個類中含有虛函式的物件,編譯器都會為它們指定乙個虛表 其實是乙個函式指標陣列 儲存在資料區,它由此類所有的物件共用 即靜態的 同時編譯器也會為它 每個類物件 加上乙個成員變數,乙個指向自己虛表的指標 常稱為 vptr 並存放在物件的首位址上,由此每...