C++ 面試被問到的“左值引用和右值引用”
1.左值和右值
在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值(將亡值或純右值)。
舉個(gè)例子,int a = b+c, a 就是左值,其有變量名為a,通過&a可以獲取該變量的地址;表達(dá)式b+c、函數(shù)int func()的返回值是右值,在其被賦值給某一變量前,我們不能通過變量名找到它,&(b+c)這樣的操作則不會(huì)通過編譯。
左值是可以放在賦值號(hào)左邊可以被賦值的值;左值必須要在內(nèi)存中有實(shí)體;
右值當(dāng)在賦值號(hào)右邊取出值賦給其他變量的值;右值可以在內(nèi)存也可以在CPU寄存器。
一個(gè)對(duì)象被用作右值時(shí),使用的是它的內(nèi)容(值),被當(dāng)作左值時(shí),使用的是它的地址。
2.左值引用
左值引用就是我們平常使用的“引用”。引用是為對(duì)象起的別名,必須被初始化,與變量綁定到一起,且將一直綁定在一起。
我們通過 & 來(lái)獲得左值引用, ?
type &引用名 = 左值表達(dá)式;?
可以把引用綁定到一個(gè)左值上,而不能綁定到要求轉(zhuǎn)換的表達(dá)式、字面常量或是返回右值的表達(dá)式。舉個(gè)例子:
int?i?=?42;
int?&r?=?i;????//正確,左值引用
int?&r1?=?i?*?42;???//錯(cuò)誤,?i*42是一個(gè)右值
const?int?&r2?=?i?*?42;?//正確,可以將一個(gè)const的引用綁定到一個(gè)右值上
3.右值引用
右值引用是C++11中引入的新特性 , 它實(shí)現(xiàn)了轉(zhuǎn)移語(yǔ)義和精確傳遞。
它的主要目的有兩個(gè)方面:
消除兩個(gè)對(duì)象交互時(shí)不必要的對(duì)象拷貝,節(jié)省運(yùn)算存儲(chǔ)資源,提高效率。
能夠更簡(jiǎn)潔明確地定義泛型函數(shù)。
右值引用就是必須綁定到右值的引用,他有著與左值引用完全相反的綁定特性,我們通過 && 來(lái)獲得右值引用。
右值引用的基本語(yǔ)法type &&引用名 = 右值表達(dá)式;
右值有一個(gè)重要的性質(zhì)——只能綁定到一個(gè)將要銷毀的對(duì)象上。舉個(gè)例子:
int??&&rr?=?i;??//錯(cuò)誤,i是一個(gè)變量,變量都是左值
int?&&rr1?=?i?*42;??//正確,i*42是一個(gè)右值
4、右值引用和左值引用的區(qū)別
左值可以尋址,而右值不可以。
左值可以被賦值,右值不可以被賦值,可以用來(lái)給左值賦值。
左值可變,右值不可變(僅對(duì)基礎(chǔ)類型適用,用戶自定義類型右值引用可以通過成員函數(shù)改變)。
原文鏈接: https://blog.csdn.net/qq_41181857/article/details/107581632
推薦:
很多人搞不清 C++ 中的 delete 和 delete[ ] 的區(qū)別
看懂別人的代碼,總得懂點(diǎn) C++ lambda 表達(dá)式吧
Java、C++ 內(nèi)存模型都不知道,還敢說自己是高級(jí)工程師?
C++ std::thread 必須要熟悉的幾個(gè)知識(shí)點(diǎn)
c++ thread join 和 detach 到底有什么區(qū)別?
C++ 面試八股文:list、vector、deque 比較
C++ STL deque 容器底層實(shí)現(xiàn)原理(深度剖析)
