帶右值引用的拷貝建構函式和運算子過載函式

2021-10-10 17:40:23 字數 1876 閱讀 3386

考慮乙個占用堆資源類物件的拷貝構造和賦值運算子過載函式,當我們用乙個臨時物件去拷貝構造乙個新物件或者賦值給乙個已經存在的物件時,會出現一下的問題:如string類

#include

#include

using

namespace std;

class

mystring

else

}mystring

(const mystring& src)

mystring&

operator=(

const mystring& src)

delete

mptr;

mptr =

newchar

[strlen

(src.mptr)+1

];strcpy

(mptr, src.mptr)

;return

*this;}

~mystring()

const

char

*c_str()

const};

mystring getstring

(mystring &s)

intmain()

1.當我們用臨時物件去拷貝構造乙個新物件時。

顯然,這樣做很不合理,很浪費!!!你臨時物件用完就析構了,還不如直接給我新物件用,避免開闢新空間,避免拷貝!!!

到這裡就引出了第乙個主題,帶右值引用的拷貝建構函式。因為臨時物件是右值。臨時物件用完就要析構的,那就把臨時物件占用的資源直接給新物件就好了。這樣做一方面避免了在原來拷貝建構函式需要首先申請空間,然後進行拷貝的麻煩。另一方面避免臨時物件析構時還有釋放堆資源的麻煩,一舉兩得!!!

mystring

(mystring &&src)

2.當我們用臨時物件去賦值乙個已經存在的物件時。這裡指的物件都是持有堆資源的物件。

首先,被賦值的物件要釋放自己占用的堆資源,然後申請乙個和臨時物件指向堆資源一摸一樣大小的空間,之後將臨時物件指向堆空間的內容拷貝到自己的堆空間中。

這裡同樣存在著上邊的問題,我臨時物件給你賦值完我就析構了,堆資源也在析構函式中被釋放了,但是你被賦值的物件還得申請空間,還得拷貝,你直接用臨時物件的那塊堆資源不就好了。

問題就處在臨時物件賦值完就析構了,與其白白浪費,不如拿來直接使用,有點「偷」的感覺!!!

;}結論:

至此,通過乙個例子我們總結出了帶右值引用的拷貝建構函式和運算子過載函式所帶來效率的提公升,以及為什麼可以這樣處理的原因。在實際開發中,當出現一定要用臨時物件作為返回值,要用臨時來進行賦值時,我們可以為其類實現帶右值引用的拷貝建構函式和運算子過載函式,在程式的效率上會得到很大的提公升。

右值引用 移動建構函式和move

左值和右值判斷 1 可位於賦值號 左側的表示式就是左值 反之,只能位於賦值號右側的表示式就是右值。2 有名稱的 可以獲取到儲存位址的表示式即為左值 反之則是右值。例如 int i 10 10 i 錯誤,10為右值,不能當左值用 int j 20 j i i和j都是左值,但是i可以當右值用 以上面定義...

c 右值引用之轉移建構函式

右值引用是用來支援轉移語義的。轉移語義可以將資源 堆,系統物件等 從乙個物件轉移到另乙個物件,這樣能夠減少不必要的臨時物件的建立 拷貝以及銷毀,能夠大幅度提高 c 應用程式的效能。臨時物件的維護 建立和銷毀 對效能有嚴重影響。這裡有c 之左值引用和右值引用 在現有的 c 機制中,我們可以定義拷貝建構...

C 引用和拷貝建構函式

1,c 中的指標 c 是一種型別要求更強的語言,不允許隨便把乙個型別的指標指派給另乙個型別。2,c 中的引用 引用,就像自動被編譯器逆向引用的常量型指標。使用引用的規則 a,必須初始化 b,一旦乙個引用被初始化為指向乙個物件,就不能被改變為對另乙個物件的引用。c,不可能有null引用。必須確保引用和...