C++左值引用和右值引用
1.左值和右值概念:
左值是可以放在賦值號左邊可以被賦值的值:左值就是指在表達式使用完之後仍存在的對象(存儲空間);
右值當在賦值號右邊去除值賦給其他變量的值:右值可以在內存也可以在CPU寄存器。
可以簡單的認為左值就是具有名稱的對象,所有的變量(包括const修飾的變量)都是左值。而右值指的是那些在表達式使用完之後就不再存在的存儲空間,實際上所有的臨時變量表達式都是右值:如下解釋了左值和右值的區別:
int x=3+4;//x是左值,3+4是右值,3+4的結果存放在臨時對象中,在表達式之外這些空間都是不可訪問的。
一個對象被用作右值時,使用的是它的內容(值),被當作左值時,使用的是它的地址。
2.引用
引用是C++語法做的優化,引用的本質還是靠指針來實現的。引用相當於變量的別名。
引用可以改變指針的指向,還可以改變指針所指向的值。
引用的基本規則:
1)聲明引用的時候必須初始化,且一旦綁定,不可把引用綁定到其他對象;即引用必須被初始化,不能對引用重新定義;
2)對引用的一切操作,就相當於對原對象的操作。
3.左值引用和右值引用:
左值引用的基本語法: type &引用名=左值表達式;
右值引用的基本語法:type &&引用名= 右值表達式;
4.右值引用用來解決以下兩種問題:
1)移動語義:
移動語義允許程序員將資源(比如動態分配內存)從一個對象移動到另一個對象,這將大大提高程序的性能,註意這裏是移動而非復制。右值引用可以支持移動語義,是因為 它允許資源從臨時對象移動出來,而初次之外是無法引用臨時對象(右值)的。
當對右值進行操作時,右值本身往往沒有必要保留,因此在有些情況下,右值資源可以直接移動給其他對象。通過右值引用,程序可以明確的區分出傳入的參數是否為右
值,從而避免不必要的復制,因而可以提高程序的效率。下面考慮std庫內的實現數據交換的swap()函數,假設X是一個已經實現備份構造函數即備份賦值運算符的類:
template
C++左值引用和右值引用