左值引用和右值引用

2021-10-08 12:33:07 字數 1243 閱讀 2080

1.左值和右值

在c++11中可以取位址的、有名字的就是左值,反之,不能取位址的、沒有名字的就是右值(將亡值或純右值)。

舉個例子,int a = b+c, a 就是左值,其有變數名為a,通過&a可以獲取該變數的位址;表示式b+c、函式int func()的返回值是右值,在其被賦值給某一變數前,我們不能通過變數名找到它,&(b+c)這樣的操作則不會通過編譯。

左值是可以放在賦值號左邊可以被賦值的值;左值必須要在記憶體中有實體;

右值當在賦值號右邊取出值賦給其他變數的值;右值可以在記憶體也可以在cpu暫存器。

乙個物件被用作右值時,使用的是它的內容(值),被當作左值時,使用的是它的位址。

2.左值引用

左值引用就是我們平常使用的「引用」。引用是為物件起的別名,必須被初始化,與變數繫結到一起,且將一直繫結在一起。

我們通過 & 來獲得左值引用,

type &引用名 = 左值表示式;

可以把引用繫結到乙個左值上,而不能繫結到要求轉換的表示式、字面常量或是返回右值的表示式。舉個例子:

int i =42;

int&r = i;

//正確,左值引用

int&r1 = i *42;

//錯誤, i*42是乙個右值

const

int&r2 = i *42;

//正確,可以將乙個const的引用繫結到乙個右值上

3.右值引用

右值引用是c++11中引入的新特性 , 它實現了轉移語義和精確傳遞。

它的主要目的有兩個方面:

消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。

能夠更簡潔明確地定義泛型函式。

右值引用就是必須繫結到右值的引用,他有著與左值引用完全相反的繫結特性,我們通過 && 來獲得右值引用。

右值引用的基本語法type &&引用名 = 右值表示式;

右值有乙個重要的性質——只能繫結到乙個將要銷毀的物件上。舉個例子:

int

&&rr = i;

//錯誤,i是乙個變數,變數都是左值

int&&rr1 = i *42;

//正確,i*42是乙個右值

4、右值引用和左值引用的區別

左值可以定址,而右值不可以。

左值可以被賦值,右值不可以被賦值,可以用來給左值賦值。

左值可變,右值不可變(僅對基礎型別適用,使用者自定義型別右值引用可以通過成員函式改變)。

左值和右值,左值引用和右值引用

左值 lvalue 這一術語 於c語言,用來指代那些可以用在賦值表示式左側的東西,具名物件 在棧和堆上分配的物件,或者其他物件的成員,總之就是又確定儲存空間的東西。而術語右值 rvalue 也是源自c語言,指的是只能在賦值表示式右側出現的東西,如字面值和臨時物件。只能繫結到左值,不能繫結到右值的引用...

左值 右值 左值引用 右值引用

2015 06 01 15 07 404人閱讀收藏 舉報 c 11 5 一 c 中的左值和右值 誤區 左值位於等號左邊,右值位於等號右邊。c 11中的定義 左值表示式表示的是乙個物件的身份 在記憶體中的位置 而右值表示式表示的是物件的值 內容 左值和右值都是針對表示式而言的,左值是持久的,右值是短暫...

左值 左值引用 右值 右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...