C 右值引用

2021-10-08 14:48:30 字數 1126 閱讀 2019

1.提高程式執行速度,用移動建構函式,而不是拷貝建構函式。

之前用拷貝建構函式,c++在三種情況下會呼叫拷貝建構函式(可能有紕漏),第一種情況是函式形實結合時,第二種情況是函式返回時,函式棧區的物件會複製乙份到函式的返回去,第三種情況是用乙個物件初始化另乙個物件時也會呼叫拷貝建構函式,拷貝建構函式,實際上就是把a物件的內容複製乙份到b,那麼為什麼我們不能直接使用a的空間呢?這樣就避免了新的空間的分配,大大降低了構造的成本。這就是移動建構函式設計的初衷

2.用&&實現移動建構函式

此函式根本沒有移動的操作,只是把左值強制轉成乙個右值

int i = 5; //左值引用

//int &&val = i;//出錯,左值不能綁到右值

int &&val = std::move(i);//把乙個左值變成右值

i = 10;//i=10, val=10;

val = 11; //val就是代表i,i=11, val=11;

int &&refrightvalue = 5;//右值引用

//int &&rval = refrightvalue;//出錯

int &&rval = std::move(refrightvalue);

int refrightvalue = 7;

int rval = 12;

string str1 = "hello world1111";

string def1 = std::move(str1);//會執行string裡的移動建構函式,把str1裡的內容轉移到def1中,此時str1=""

string str2 = "hello world2222";

string &&def2 = std::move(str2);//不會執行string裡的移動建構函式,此時str1="hello world2222"

拷貝建構函式:time::time(const time &t) {}  //const左值引用

移動建構函式:time::time(const time &&t) {}  //右值引用

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

c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...

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

在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...

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

就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...