引用
從C過來的同學可能會對C++中的“&”表示不解。“&”在C中就是表示取地址符,在C++的實踐中,它也確實有取地址的功能。但是,在C++中,它的功能不止於此,它有了一個更准確的名稱:引用。
引用是C++的引入的語言特性,它表示某一對象的別名。對象和對象的引用都指向同一地址,對引用的操作實際上就是對原對象的操作。引用的聲明語法為:
類型標識符 &引用名=目標變量名;
說明:
(1)&在此不是求地址運算,而是起標識作用。
(2)類型標識符是指目標變量的類型。
(3)聲明引用時,必須同時對其進行初始化。
(4)引用聲明完畢后,相當於目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量名的別名。
(5)聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數據類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。故:對引用求地址,就是對目標變量求地址。&ra與&a相等。
(6)不能建立數組的引用。因為數組是一個由若干個元素所組成的集合,所以無法建立一個數組的別名。
int main( ){ int a=1; int &b=a; b=2; cout<<a<<endl; } //輸出結果為2
引用的應用
光是給變量取別名似乎並沒有多大的意義,它的常見用法有下面幾種:
1.函數引用傳遞
普通函數的參數傳遞為值傳遞,在調用時,會為形參分配存儲單元,然后將實參的值賦給形參,相當於創建一了份實參的副本供函數使用。值傳遞有兩個特征:
(1)在函數內對形參的操作不會影響實參
(2)當傳入的數據量較大時,會浪費空間。
為了解決傳遞大塊數據時,值傳遞方式造成的空間浪費,C語言的做法是傳遞指針從而實現直接對原數據的操作。而在C++中,我們可以使用引用傳遞來解決這個問題。只需要將形參定義為引用的形式,例如:
#include <iostream> using namespace std; //引用傳遞的方式 void func(int &a){ a=a+10; } //傳統值傳遞的方式 void func1(int a){ a=a+10; } int main( ){ int a = 5,b=5; func(a); func1(b); cout<<a<<" "<<b<<endl; } //輸出結果為15 5
使用指針與引用的區別在於:使用指針時,雖然傳遞的是指針,但仍然是值傳遞的方式。指針也是變量,系統仍然會為形參分配空間。並且,大量使用指針,會導致程序可讀性變差,且容易出錯。
2.常引用
如果想使用引用,但又想確保引用數據的安全性,此時可以使用const關鍵字來定義常引用。常引用和常量一樣,不允許被修改。
int main( ){ int a = 1; const int &b = a; //當嘗試通過引用修改變量時,程序會報錯 b=2; }
解引用
在C語言中"*"用來定義一個指針變量,它不表示實質的運算而僅僅起到標志的作用。但是在C++中“*”是一個一元運算符,叫做“解引用運算符”。它的作用是獲取地址中存儲的值。它的操作數必須是一個合法有效的地址數據。
int main( ){ int a = 1; //創建指針b,存儲a的地址 int *b = &a; //對指針b中存儲的地址進行解引用 int c = *b; //輸出結果為:1 0x61feb4 1 cout<<a<<" "<<b<<" "<<c; }
參考內容:https://www.cnblogs.com/mlgjb/p/8821340.html