1. 程式人生 > >C++11學習9---移動建構函式

C++11學習9---移動建構函式

主要講的是如何實現移動構造。

1.移動構造的原因

這個移動構造,或者移動拷貝賦值,有竊取資源的意思。

這個竊取資源時對於指標持有的資源來說的。

而這個竊取是通過在建構函式與過載拷貝賦值的時候,編碼將當前的指標指向資源,再將原來的指標,指向nullptr實現的。

當然,你也可以不對指標這樣使用,比如對於任意的型別,將其拷貝給現在的,再將原來的置為空值。

但是這樣沒有意義,因為相對於很大的記憶體資源來說,拷貝一個指標相對於拷貝整個資源代價忽略不計,

而你對普通資源這樣做,就失去了意義,因為反正一切資源你都已經拷貝了。

這個拷貝一個指標,然後把原指標置為nullptr,實現資源擁有權的轉移也正是移動構造的意義所在。

2.move的意義

那麼這個move有什麼用呢?

普通的拷貝建構函式是const &T,常量引用。

你要定義一個移動構造,實際上傳入的引數是一樣的,但是又要和拷貝構造區分開來。

所以就發明了一個右值引用&& T。

但是我們在傳入實參的時候,直接傳入,就代表了const &T,而這個右值引用要如何表達呢?

於是就發明了一個move語句,取得物件的右值引用。

這樣當定義了移動語義的建構函式或者是賦值運算子的類,就能夠愉快地呼叫了。

3.結果

結果就是,

(1)對於一些沒有用指標持有資源的類,比如說

C++內建型別,你呼叫move取得其右值引用是沒用的。

因為內建型別沒有定義移動建構函式,移動賦值運算子。

所以這就相當於直接賦值。

(2)對於用指標持有資源的標準庫

這些類比如,string、vector、shared_ptr、thread

都是定義了各自的移動語義的。

這個時候就可以竊取,被竊取的物件的值就置為空。

(3)你自己定義的類

這就要看你的類的組織形式啦。

如果你的類並沒有通過指標持有資源,那麼定義移動建構函式是完全沒有意義的。