左值引用對於一般的c++程式設計師再熟悉不過,但對於右值引用(c++0x新特性),就稍微有點不知所云
在定義變數的時候,經常會用到左值和右值,比如:上面這段**,a先作為左值,在作為右值。在作為右值的時候,是相當於(原理上等同,但不一定對)
int a = 1;
int b = a + 1;
中間會先建立乙個臨時遍歷,然後在把臨時遍歷賦值給b。對於數,只能作為左值,而變數名,即可以作為左值又可以作為右值。(作為左值的時候相當於用該變數的位址,作為右值的時候則相當於使用該變數的內容,這裡對於類物件也成立)。int tmp(a + 1);
int b(tmp);
用法:type & 左值引用名 = 左值表示式;
注意點:宣告時必須初始化,初始化之後無法在改變;對別名的一切操作都等價於對原來變數的操作。
左值引用在傳遞引數的時候,和指標特別類似,如以下**:
int val = 10;
void fun(int * ptr)
這裡不能使用const a&& a,因為需要改變a。移動建構函式主要的用途是,當你不需要在使用乙個變數的時候,可以直接通過該建構函式來實現把該變數的資料轉換到另乙個變數中,省去呼叫預設的賦值構造或者拷貝建構函式帶來額外的開銷,如string類在賦值或者拷貝建構函式中會宣告char陣列來存放資料,然後把原string中的 char 陣列被析構函式釋放,如果a是乙個臨時變數,則上面的拷貝,析構就是多餘的,完全可以把臨時變數a中的資料直接 「轉移」 到新的變數下面即可。 如下面的程式(摘抄自網頁):
#include
#include
#include
#include
intmain
()
總結:其實這個右值引用主要的用處就是在於配合std::move來實現 「轉移語句」
a();
//預設建構函式
a(const a& a);
//拷貝建構函式
oprator=(const a& a);
//賦值建構函式
a(a&& a);
//移動建構函式
可以在移動建構函式中實現 把a的資料直接轉移到 新的變數b下面,而省去 申請宣告乙個變數b, 把 copy a->b, 然後釋放 a
的空間。
比如,string str = 「hello"; 現在str不在使用了,但需要宣告乙個新的變數表示str, 此時就可以用 string newstr(str::move(str)); 呼叫移動建構函式,把str下面的內容全部轉移到 newstr下面,「掏空」str,這裡需要注意掏空str之後,最好就不要在使用str了。(有點囉嗦了)
注釋:賦值建構函式:a & operator = (const a& a); //這裡返回a & 是為了進行連等 a1 = a2 = a3,當乙個變數已經被定義之後,改變值的時候呼叫該函式
拷貝建構函式:a(const a&a); 直接在定義宣告乙個物件的時候,依據另乙個物件來構造。
左值右值定義:
右值表示式vs左值表示式:
左值引用和右值引用:
右值引用:
臨時物件不能繫結到非const左值引用上:
std::move用法理解
std::move比較好的解釋:
另外三篇關於std::move 的用法:
上:中:
下:
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...