C++
-
左值和右值、
- 左值是能用在賦值陳述句等號左側、代表一個地址、
- 為了對比左值所以出現了右值、與左值相反、
- 運算式先判斷是否為左值、非左即右、沒有其它選項、
- 左值可以當成右值使用、
- a=a+1——a是左值不是右值、a在右邊是所以a有右值屬性(非右值屬性)、a左邊代表地址、右邊代表值、
- 一個左值可以同時具有右值屬性和左值屬性、變數是左值
- 可以將左值運算式理解為左值、而右值運算式便是右值、
- 賦值運算子、地址運算子、容器下標、迭代器遞增遞減、等均需要用到左值、只要運算子在字面值上能操作一般都需要左值、
- 左值運算式的求值結果是個物件、必須有地址、有地址不一定是左值、但是左值一定要有地址、地址是核心、
-
參考分類、
- 三種參考方式、
- 左值參考(系結到左值)
- const參考(常量參考)是左值參考的一種、特點是、不能改變值的物件、
- 右值參考(系結到右值)相當于為左值參考而生、其主要作用是臨時的參考、
- 右值參考使用 &&a=1 1便是臨時的值、臨時保存、
- 三種參考方式、
-
左值參考、
-
將變數值系結到左值上便是左值參考、大部分都是左值參考、
-
參考一定要系結一個數值、不像指標有空指標、參考沒有空參考、初始化系結、參考必須初始化、
-
左值參考必須系結到左值不能系結給到右值
-
int a=3//左值因為變臉便是左值、 int &c=a//系結左值、 int &a1=++b//左值 -
任何函式里面的形參都是做左值、
-
-
右值參考、
-
右值參考的參考目的、
- 系結一些即將銷毀的或者臨時的物件上、
- 右值參考 && 代表新的資料型別、
- 目的是通過把拷貝物件變成移動物件來提高運行效率、
- 移動物件是替代拷貝物件而出現的、將a移動到b、方式是a自己開辟了記憶體、b也需開辟記憶體存盤資料、移動物件就是b不再開辟內容而直接將a的記憶體給b、將a的記憶體直接移交給b、或者b偷a的所有記憶體、
- 移動物件后a便不能再使用、
- 右值參考是為了應付移動建構式和移動賦值運算子而用的、
-
必須是系結到右值的參考、
-
右值參考也是參考 即物件的名字、
-
右值參考也是有地址的、
-
左值不能系結到臨時變數、臨時變數有地址但是系統將其當成右值、
-
要想將臨時變數綁到左值可以使用const參考、const參考不僅可以系結還可以執行隱式轉換并將值放到臨時變數中、
-
int e; int a = e; int e = 10; int& c = a; int&& d = 100;//右值
-
-
std::move函式、
-
將左值強制轉換成右值、唯一的作用、
-
沒有移動的功能、
-
int a = 29; int&& b = std::move(a);//強行系結、也是move的唯一作用、 -
將b和a系結在一起、改變b、a也會改變、改變a、b也會改變、
-
int a = 29; int&& b = std::move(a);//強行系結、也是move的唯一作用、 string c = "這是字串";//運行后c的內容為空、 const char* f = c.c_str(); string e = std::move(c);//其實是、std::move觸發了string里面的函式、將c里面的內容清空啦、 string是移動建構式、將c的值移動到e里面、 const char* s = e.c_str(); cout << c << endl; cout << e << endl; cout << b << endl; -
轉移并非是move做的、e是重新開辟的記憶體存盤c的內容、
-
c和e均各有自己的記憶體、
-
string &&e = std::move(c) 這樣就不會觸發string的內部函式、而是右值參考、
-
-
總結、
-
左值系結左值、右值系結右值、const則可以系結右值或左值、
-
a– –(后置遞增或遞減運算子)回傳右值、— —a (前置遞增或遞減運算子)回傳的是左值、
-
int a = 1; int&& b = a++;//右值、b和a沒有任何關系 int& c = ++a;//左值、 -
系統不建議執行move后繼續使用移動的值、也就是 c 但是、后續仍然可以使用、
-
int a = 29; int&& b = std::move(a);//強行系結、也是move的唯一作用、 string c = "這是字串";//運行后c的內容為空、 const char* f = c.c_str(); string &&e = std::move(c);//系統不讓使用在以后的代碼中出現c const char* s = e.c_str(); c = "abc";//后續仍然可以使用、 //e = "aaa"; cout << c << endl; cout << e << endl; cout << b << endl;
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/178065.html
標籤:其他
