昨天寫**遇見乙個這樣的錯誤:;
};int main()簡單定義:記憶體中有確定儲存位址的物件的表示式的值,可以是乙個變數名:int a;
,可以是乙個賦值表示式a=b
,或者字串常量"cnblogs"
,總之,最簡單鑑別的方法就是編譯以下這個句子&(需要鑑別的表示式)
,能通過編譯就是左值。
嚴格定義見:c++文件
可以被取位址(&),上邊我們就是用這個方法來鑑別左值。
可以被賦值,或者複製賦值;
//賦值
int a = 10;
//複製賦值
int a(10);
可以初始化左值引用,也就是我們常用的引用;
int a=10;
int& reference = a;
這是一些常用的性質,更多性質見:c++文件
:非左值。
常見的有字面值(除了字串常量),後置自增自減表示式a++;a--;
不能被取位址
int a = 1;
int* p = &(a++); //報錯,a++是右值,不能被取位址,而++a是左值
不能被賦值或者複製賦值
42 = 10;//很明顯會報錯
可以初始化const左值引用 ,這就是我開頭程式報錯的原因!我的程式沒有const
class myclass ; //這裡的形參引用用const修飾就可以編譯通過了!!!
};int main()
可以初始化右值引用;因為右值引用已經超出我的知識範疇了,以後學到再來補充。
note:下邊的引用都是說左值引用
那為什麼加上const
就可以了呢?
這是因為將const引用繫結到右值時,編譯器採取了一種妥協機制:編譯器會為臨時資料建立乙個新的、無名的臨時變數,並將臨時資料放入該臨時變數中,然後再將引用繫結到該臨時變數。注意,臨時變數也是變數,所有的變數都會被分配記憶體。所以說const
引用實際上是和右值的乙個copy繫結了。
參考:
左值和右值,左值引用和右值引用
左值 lvalue 這一術語 於c語言,用來指代那些可以用在賦值表示式左側的東西,具名物件 在棧和堆上分配的物件,或者其他物件的成員,總之就是又確定儲存空間的東西。而術語右值 rvalue 也是源自c語言,指的是只能在賦值表示式右側出現的東西,如字面值和臨時物件。只能繫結到左值,不能繫結到右值的引用...
左值和右值
c c 語言中可以放在賦值符號左邊的變數,即具有對應的可以由使用者訪問的儲存單元,並且能夠由使用者去改變其值的量。或者說左值是代表乙個記憶體位址值,並且通過這個記憶體位址,就可以對記憶體進行讀並且寫 主要是能寫 操作 這也就是為什麼左值可以被賦值的原因了。相對應的還有右值 當乙個符號或者常量放在操作...
左值和右值
參考 左值就是在賦值中可以放在賦值操作符兩邊的值,比如 int a 1 double b 2.0 a b b a 這裡a和b都是左值,一切變數都是左值,但const量是例外。而右值則是只可以放在賦值操作符右邊的值,比如 int a 0 char b hello 3 a error howdy b e...