引用是已定義變數的別名
int a;
int & b = a; // b為a的引用
引用作為函式引數,使得函式中的變數名成為呼叫函式程式中的變數的別名。這種傳遞稱為引用傳遞,按引用傳遞允許被呼叫函式能訪問呼叫函式中的變數。
void swapr(int & a,int & b); // 引用傳遞
void swapv(int a,int b); // 值傳遞
swap()
為交換函式,上面三個分別引數為引用、值、指標。經過我的一番測試發現。函式中的值傳遞並不能改變呼叫函式中a , b的值。引用和指標則可以。
// 函式宣告
double cube(double &a)
// 呼叫函式
cube(x+2);
當函式cube()
的引用引數應該是可以修改的,但是傳遞的值是(x+2)並不是變數,所以編譯時會出現錯誤。
但是,如果在引用前加上const
程式就能執行了,const
指定引用不能被修改,所以是否為變數也就不重要了。但是編譯器會為其建立乙個臨時變數,儲存(x+2),然後將 a 成為臨時變數的引用。
那麼什麼情況下會建立臨時變數呢?如果引用引數是const,則編譯器會在下面兩種情況生成臨時變數:
引用非常適合結構和類。引入引用主要是為了用於這些型別,而非用於基本的內建型別。
引用這麼高效為什麼內建型別不使用引用呢?
使用結構變數引用引數和基本變數一用引數相同,就相當於別名,這裡就不贅述了。
引用既然能作為引數,那麼能否作為返回值呢? 答案是肯定的。
為什麼要返回引用呢? 毫無疑問,為了讓程式效率更高。
// 宣告函式:返回值是struct_a 型別的引用
struct_a & run(struct_a & a,const struct_a & b)
// dup接收run的返回值
struct_a dup = run(a,b);
當函式run()
返回值為型別時,dup接收的是乙個結構,將把乙個結構複製到乙個臨時位置,再將這個拷貝複製給dup,消耗空間且效率低。
但返回值為引用時,直接將a 複製到dup,效率更高
注意:在返回值為引用時不能返回棧空間的值,函式中建立的臨時變數即使為引用,但是函式結束後棧空間的內容都會被銷毀,返回將會出現錯誤。
使用引用引數的原因:
修改呼叫函式中的函式物件
通過傳遞引用而不是整個資料物件,提高程式的執行速度
當資料物件較大的時候,第二個原因尤為重要。這些也是使用指標引數的原因。
那麼指標引數和引用又有什麼區別呢?
引用引數實際上是基於指標的**的另乙個介面,至此,引用展現了它的廬山真面目,其實它和指標在底層實現沒什麼兩樣,只是在使用上,有時引用會更加順手。
那麼什麼情況下,應該使用何種傳遞引數的方式呢?
C 引用變數( )
1 建立引用變數 1 必須在宣告引用變數時進行初始化 int rat int rodent rat 可以通過初始化宣告來設定引用,但不能通過賦值來設定。nt rat int rodent rat int b 50 rodent b 這裡rodent依然是rat變數的別名,只是現在rat和rodent...
C 引用變數
一,引用變數 c 新增了一種復合型別 引用變數。引用是已定義變數的別名,使用引用變數的主要的用途是作為函式的引數。通過將引用變數用作引數,通過形參就可以對原始的資料進行修改。這樣除指標之外,引用也為函式處理class與struct提供了一種非常方便的途徑。二,宣告引用變數 c與c 使用 來獲取變數的...
C 引用變數
首先說一下,引用變數是什麼?引用變數是已定義的變數的別名 即另乙個名字 舉個例子 int x 100 int y x 現在y就相當於x的小名,他們表示的都是乙個東西。就像你叫張三,小名土豆。張三和土豆都是你。說完了引用變數是什麼再來說一下它的用途。引用變數主要的作用是作為函式的引數,來使得函式中的變...