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

2021-10-01 09:47:26 字數 1384 閱讀 4878

就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值(唯讀);對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值(讀寫),這是很常見的。在c++中,前一種變數稱為右值,後一種變數稱為左值,例如:

int a =1;

// a是左值,1是右值

稍稍不同的一點是,在c++中,乙個變數是左值還是右值並不取決於我們如何使用它,這僅僅由它的型別和生成的方式決定,這是由c++標準規定的。(下文中提到的左值變數和右值變數均指的是c++標準中所規定的 「左值」 和 「右值」)

在c++中,我們可以讀寫左值變數,但我們不能(而不僅僅是 「不會」 )改變右值的值(僅有的兩個例外將在下文中提到)。不能對右值進行取址(這點不存在例外)。

在c++中,如果乙個表示式表示了乙個左值變數,那麼把這個表示式稱為 「左值表示式」;如果乙個表示式表示了乙個右值變數,那麼把這個表示式稱為 「右值表示式」。

例如,對於具有返回值的函式呼叫表示式,如果函式返回引用型別,那麼函式呼叫表示式指示著返回值 「引用」 的變數,如果這個變數是左值(右值),那麼函式呼叫表示式是左值(右值)表示式;如果函式返回其他型別,那麼函式呼叫表示式指示著乙個匿名的臨時變數,這個匿名變數用於存放函式的返回值,這個匿名變數是乙個右值,因此函式呼叫表示式是右值表示式。

儘管c++標準中的規定符合大部分實際情況,例如,數字型別的字面值(1、2、3、3.56、7 …)被規定為右值,而的確沒有哪乙個人會想要改變量字1的值,但仍然存在一些疏漏。

如果你細心觀察,不難發現我們有時候會想要改變一些右值的值,而有的時候又希望一些左值具有不可改變的值。為了應付這種情況,c++標準中引入了兩個例外。對於前者,我們可以通過右值引用來改變右值的值,對於後者,我們可以使用常量左值。

常量左值在宣告時帶有 const 限定符,這種變數必須初始化且初始化後變數值不能再改變,請看**:

const

int a =10;

// 宣告了常量左值a,初始化為10

a =15

;// 非法,試圖通過賦值改變常量左值a的值

右值引用是對右值的 「引用」,正如通過左值引用可以改變左值變數的值一樣,通過右值引用也可以改變右值變數的值。

請看**:

#include

classa;

a test()

;int

main()

a test()

執行結果:

15

10

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

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

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

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

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

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