引用和指標
1、什麼是引用
引用:在程式的不同部分使用兩個以上的變數名指向同一塊地址,使得對其中任何一個變數的操作實際上都是對同一地址單元進行的。
2、引用的特點有:
(1)單一變數可由多個別名
(2)引用必須初始化(指標可以先宣告再引用),接近const指標一旦建立則效忠於其。
(3)引用只能在初始化的時候引用一次,不能更改為轉而引用其他變數,即不能通過賦值來實現引用。
(4)對引用進行操作,實際是對被引用的變數進行操作
(5)引用是變數的別名,而不是定義了一個變數,引用不佔記憶體,只是和目標變數指向目標的同塊記憶體地址,宣告引用時目標的儲存狀態不會改變。
(6)表示式中的取地址符&不再是取變數的地址,而是用於表示該變數是引用型別的變數。
(7)引用不能套娃,只有一級;指標可以連續套娃,有多級。引用沒有空引用,指標有空指標。
3、左值和右值的定義:
左值是具名變數可以取地址,是長久的;右值是匿名變數不能取地址,是短暫的。左值可以轉化為右值,但是右值不能轉化為左值。
下述程式碼含有左值引用的正確規範,其中int &y=100是違背引用精神的,100為數字常量屬於右值不能實現左值的轉換。這種情況的解決方案為常量左值引用,這樣引用指向的值不能改變。
//左值引用 int x = 100; int &y = x; y++; //下面這張情況是違背右值不能轉換左值結論的 int &y = 100; //解決方案為: const int &y = 100;
右值引用的形式類似int &y=100,這是C++11版本增加的功能,右值引用關聯到右值時右值被儲存到特定位置,右值引用指向特定位置,右值雖然無法獲取地址但是右值引用能獲取地址(臨時物件的儲存位置),本質是編譯器為右值提供了臨時變數空間。
C++11提供了move函式用於獲得繫結到左值上的右值引用(定義於utility標頭檔案中)。
int &y = move(x)
4、引用的應用主要由基礎引用、const引用、引用做引數、引用做返回值。其中,引用做函式返回值型別使用的時候,原先函式的返回值是將內容複製到一個臨時返回儲存單元中,然後該臨時返回儲存單元的內容將被複制到新儲存單元,使用引用返回函式值時內容可以直接複製到新儲存單元。返回引用需要注意的問題是避免函式終止時不再存在的記憶體單元(臨時變數)引用
const A & B(A & a)
{
A * a1 = new A;
* a1 = a;
return *a1;
}
//注意:不再需要new分配的記憶體時要使用delete釋放
5、指標和引用的區別:
指標的作用有:
(1)裝地址(2)不同變數訪問同一塊空間
引用:只可以實現用不同變數訪問同一塊空間
★“sizeof 引用”得到的是所指向的變數(物件)的大小,而“sizeof 指標”得到的是指標本身(所指向的變數或物件的地址)的大小;
★指標和引用的自增(++)運算意義不一樣;引用是值的增減,指標是地址的偏移
★從記憶體分配上看:程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域。
★指標和引用都是地址的概念,指標指向一塊兒記憶體,其內容為所指記憶體的地址;引用是某塊兒記憶體的別名。指標比引用更為靈活,但是其風險也很大。使用指標時一定要檢查指標是否為空(NULL),且空間回收後指標最好置零,以免野指標的發生造成記憶體洩漏等問題。
部分內容參考:https://www.cnblogs.com/shiheyuanfang/p/13353640.html