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)你自己定義的類
這就要看你的類的組織形式啦。
如果你的類並沒有通過指標持有資源,那麼定義移動建構函式是完全沒有意義的。