三、完美**
總結c++98中提出了引用的概念,引用即別名,引用變數與其引用實體公共同一塊記憶體空間,而引用的底層是通
過指標來實現的,因此使用引用,可以提高程式的可讀性。
為了提高程式執行效率,c++11中引入了右值引用,右值引用也是別名,但其只能對右值引用。
c++98就提出了引用的概念,引用就給乙個物件取別名。
c++98 左值引用
c++11 右值引用
不管是左值引用,還是右值引用,他們都是給物件取別名,
不過左值引用主要是給左值取別名,右值引用主要是給右值取別名。
什麼是左值?什麼是右值?
// =左邊就是左值?右邊的就是右值? 注意這個是乙個c語法就留下的坑,就像左移和右移一樣,
這裡左右不是方向。左邊的值也不一定左值,右邊的值不一定是右值
int x1 = 10; int x2 = x1; int x3 = x1+x2; 這裡x1是左值,10是右值,x2是左值,x1+x2表示式返回值就是右值
可以修改就可以認為是左值,左值通常是變數
右值通常是常量,表示式或者函式返回值(臨時物件)
int
main()
template
<
class
t>
voidf(
const t& a)
template
<
class
t>
voidf(
const t&& a)
intmain()
c++11又將右值區分為:純右值和將亡值
純右值:基本型別的常量或者臨時物件
將亡值:自定義型別的臨時物件
結論:所有深拷貝類(vector/list/map/set…),都可以加兩個右值引用做引數的移動拷貝和移動賦值class
string
// s2(s1)
string
(const string& s)
// s3(右值-將亡值)
string
(string&& s)
:_str
(nullptr
) string&
operator=(
const string& s)
string&
operator
=(string&& s)
~string()
private
:char
* _str;};
string f
(const
char
* str)
intmain()
//std::vector::push_back
//void push_back(const value_type& val);
//void push_back(value_type&& val);
////std::list::push_back
//void push_back(const value_type& val);
//void push_back(value_type&& val);
////std::set::insert
//pairinsert(const value_type& val);
//pairinsert(value_type&& val);
int
main()
右值引用會第二次之後的引數傳遞過程中右值屬性丟失,下一層呼叫會全部識別為左值
完美**解決
可以看出全部都是左值
右值引用做引數和作返回值減少拷貝的本質是利用了移動構造和移動賦值左值引用和右值引用本質的作用都是減少拷貝,右值引用本質可以認為是彌補左值引用不足的地方, 他們兩相輔相成
左值引用:解決的是傳參過程中和返回值過程中的拷貝
做引數:void push(t x) -> void push(const t& x) 解決的是傳參過程中減少拷貝
做返回值:t f2() -> t& f2() 解決的返回值過程中的拷貝
ps:但是要注意這裡有限制,如果返回物件出了作用域不在了就不能用傳引用, 這個左值引用無法解決,等待c++11右值引用解決
右值引用:解決的是傳參後,push/insert函式內部將物件移動到容器空間上的問題.+傳值返回接收返回值的拷貝
做引數: void push(t&& x) 解決的push內部不再使用拷貝構造x到容器空間上,而是移動構造過去
做返回值:t f2(); 解決的外面呼叫接收f2()返回物件的拷貝,t ret = f2(),這裡就是右值引用的移動構造,減少了拷貝
c 左值 右值 右值引用 左值引用
c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...
c 左值 右值 左值引用 右值引用
在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...
C 左值 右值 左值引用 右值引用
就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...