我所理解的移動構造與拷貝構造的區別

2021-10-09 05:46:25 字數 739 閱讀 6175

在c++2.0新語法中,引入了「移動構造」的方式。

在研究「移動」的時候,發現這個移動與我原先理解的移動貌似有些區別。特意整理一下,整成一片部落格。

以下純屬個人見解,如果有不對的地方,還請指正。

首先談談類的劃分,對於乙個類而言,可以簡單將其分為兩類:含有指標的不含指標的

對於不含指標的類而言,移動構造與拷貝構造在實操上應該沒有什麼區別,簡單的複製過來就行了,因為對於建構函式而言,實際上做的就是用某些值去初始化本類的物件。

但是對於含有指標的類而言,就不是這樣了,在執行拷貝構造的時候,如果僅僅是將值複製過來,那麼會出現不同的指標指向同乙個物件的情況,也就是所謂的「淺複製」,這是一種極其危險的行為。為了避免這種情況,一般採用「深複製」或者是「引用計數」的方式來執行拷貝構造(實現難度上,當然是深複製要簡單些,引用計數的方式需要考慮的東西還是比較多的)。

但是,對於深複製而言,耗時是乙個巨大的缺點,特別是在需要拷貝的東西在接下來的**中用不到的情況下,這更是乙個巨大的效能浪費,因此引出了「移動構造」的方式。

移動構造的本質實際上就是「淺複製」,直接將指標賦值過來,針對淺複製造成的危險性,在執行移動構造之後,需要將源指標置為nullptr(這點是必須的)。

因此對於含有指標的類而言,移動構造本質上還是複製,這點和不含指標的類沒什麼區別。

所以,我對其的理解就是,移動構造實際上只在含有指標的類中才真正體現其作用,在不含有指標的類中,應該沒有什麼太大的作用。

C 的拷貝構造和移動構造

如果乙個建構函式的第乙個引數是自身類型別的引用,且任何額外引數都沒有預設值,則此建構函式是拷貝建構函式。c primer,第五版 class foo 類的成員中有指標時,使用深拷貝。include using namespace std class foo foo const foo default...

C 中的拷貝構造,賦值和移動構造

在說明這幾個名詞時,我們需要定義乙個測試類person,person類的測試環境為vs2013 一般情況下,在物件宣告時用拷貝建構函式對物件進行初始化 在編譯器進行優化的時候也會使用移動構造函 數 在有臨時物件產生的情況下 這樣效率會高一些,如避免深度拷貝之類的操作 一旦初始化之後,在 進行 運算將...

拷貝建構函式的理解錯誤

事情的經過是這樣的,我在實現乙個基於opencv的cimage類。我需要實現它的拷貝建構函式,因為我要把它push back到vector裡面去。我過去的一直做法是在賦值操作符中實現真正的操作,在拷貝建構函式中呼叫。但是在這裡卻出現了記憶體錯誤。好歹我還寫過幾年程式,那我就開始了艱辛的除錯。經過除錯...