左值:就是可以放在賦值號左邊被賦值的值,必須要在記憶體有實體
右值:當在賦值號右邊取出值賦給其他變數的值
右值可以在記憶體也可以在cpu
右值是指臨時的物件,它們只在當前的語句中有效
c++primer中對 物件的定義:物件是指一塊能儲存資料並具有某種型別的記憶體空間
乙個物件a,它有值和位址&a,執行程式時,計算機會為該物件分配儲存空間,來儲存該物件的值,我們通過該物件的位址,來訪問儲存空間中的值
指標p也是物件,它同樣有位址&p和儲存的值p,只不過,p儲存的資料型別是資料的位址。如果我們要以p中儲存的資料為位址,來訪問物件的值,則要在p前加解引用操作符"*",即*p。
物件有常量(const)和變數之分,既然指標本身是物件,那麼指標所儲存的位址也有常量和變數之分,常量指標是指,指標這個物件所儲存的位址是不可以改變的,而指向常量的指標的意思是,不能通過該指標來改變這個指標所指向的物件。
我們可以把引用理解成變數的別名。定義乙個引用的時候,程式把該引用和它的初始值繫結在一起,而不是拷貝它。計算機必須在宣告r的同時就要對它初始化,並且,r一經宣告,就不可以再和其它物件繫結在一起了。
實際上,你也可以把引用看做是通過乙個常量指標來實現的,它只能繫結到初始化它的物件上。
關於指標和引用的對比,可以參看<>中的第一條條款,引用的乙個優點是它一定不為空,因此相對於指標,它不用檢查它所指物件是否為空,這增加了效率
//引用陣列是非法的
int a=5; int b;
b=a+1;//a,b在記憶體,a+1,a+3暫存器
b=a+3;
int a=5,b=10;
int &const ra=a;
ra=b ; // 編譯通過 但是 相當於跳過了 ra指向不變
引用必須初始化 引用的本質:是用指標來實現的
引用的本質是指標,直接sizeof 引用,就是求引用的資料大小
//在類裡面引用變數佔據4個位元組
cout<常引用int a=3,b=5;
const int & ra=a; //初始化後,再也不能被賦值
ra=4;//錯誤 不能修改其值
ra=b; //錯誤
int a=10; int &ra=a;//&左值引用
int * &&pa=&a;//&&右值引用
引用改變指標指向 int num1(5); int num2(10); int * pnum=&num1; int* &rpnum=pnum; rpnum=&num2;
int *p; p=&num1; //&num1在暫存器
int * &&rpnum=&num1;//引用右值 int *p1=rpnum;//用於物件拷貝
std::move(a); //左值轉換成右值
函式的指標引用 int * & get()
main()
函式之間作為引數呼叫,變數傳遞給常量引用,可以去掉const屬性 變數不行
char str[10]("hello");
const char(&rstr)[10](str);
const char(&&rrstr)[10](rstr);//引用可以給另乙個引用初始化
int (*p)(int a,int b)(jia);
int (*const &rp)(int a,int b)(p);//限定rp不能改變p指向
C C 程式設計 右值引用
右值引用不過是c 的一種新語法,重要的是基於右值引用引申處理的兩種c 程式設計技巧 移動語義和完美 c 98 03標準中就有引用,用 表示。但是此種引用方式有乙個缺陷,即正常情況下只能操作c 中的左值,無法對右值新增引用。舉個例子 int num 10 int b num 正確 int c 10 錯...
C C 左值 右值及引用
目錄 c和c 中定義了引用型別 reference type 存在左值引用 lvalue reference 而在c 11中,新增了右值引用 rvalue reference 這一概念,雖然個人感覺右值引用用處不大,但在此一併討論。首先,我們討論左值和右值兩個概念。左值 lvalue 乙個標識非臨時...
C C 筆記 之左值引用和右值引用
1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...