移動構造
淺層複製只實現物件間的資料元素一一對應,只複製成員函式中的指標位址,如下圖:pointarray2複製了pointarray1,只複製了指標,pointarray2與pointarray1指向了同一塊陣列元素,在執行後進行記憶體釋放時會先呼叫pointarray1的析構函式釋放陣列記憶體,而當pointarray2呼叫析構函式釋放陣列記憶體時會出錯,因為此時這塊記憶體已經被釋放,不存在了。
因此淺層複製不能用來返回含有指標成員的物件
當被複製的物件資料成員是指標型別時,不是複製該指標成員本身,而是將指標所指向的物件進行複製。
arrayofpoints::
arrayofpoints
(const arrayofpoints &v)
通過編寫複製建構函式將指標指向陣列中的元素進行一一複製,從而實現深層複製
深層複製,是將含有指標的成員函式連帶指標所指向的區域一起複製乙份,但有時,我們存在複製之後,原先的物件不再用到的情況,這樣就導致了記憶體空間的浪費,因此有了移動構造(我也將其理解為剪下)。
c++11之前,如果要將源物件的狀態轉移到目標物件,只能通過複製。但c++11有了移動構造,此時,轉移只需要移動物件即可。注意:移動構造時必須要把源物件資源的所有控制權都交給目標物件。
移動構造通過移動建構函式實現:如:class_name(class_name && )
//使用深層複製的方式返回臨時物件(主函式中呼叫乙個函式,函式自己建立乙個類後返回這個類,主函式再呼叫這個類中的方法)
#include
using
namespace std;
class
intnum
intnum
(const intnum &n)
:ptr
(new
int(
*n.ptr))~
intnum()
intgetint()
private
:int
*ptr;};
intnum getnum()
intmain()
//移動構造的形式實現物件的返回(由於a這個物件遲早要消亡,不如直接轉移出a物件中的內容)
#include
using
namespace std;
class
intnum
intnum
(const intnum & n)
:ptr
(new
int(
*n.ptr)
)intnum
(intnum && n)
:ptr
(n.ptr)
~intnum()
intgetint()
private
:int
*ptr;};
intnum getnum()
intmain()
由上可知,可以通過深層複製和移動構造的方式將函式中含有指標的物件返回。
使用深層複製建構函式時,返回時構造臨時物件,動態分配後將臨時物件返回給主調函式,最後刪除臨時物件。
使用移動建構函式時,將要返回的區域性變數直接轉移到主函式。省去了構造和刪除臨時物件的過程。
關於含有指標成員的類的物件之間賦值指標的問題。
在c 中,當定義了乙個類,類的成員中有指標的時候,需要注意 如果將類的物件a賦值給b的時候,兩個物件的指標是指向同乙個位址的,其餘的變數都是相等的。在影象處理中,比如定義了乙個影象類,類成員中有具體的影象資料,如果將兩個物件直接相等,會使兩個物件的資料指標指向同乙個位址。如果要使兩個物件的指向不同的...
含有指標成員的類的拷貝
題目 下面是乙個陣列類的宣告與實現。請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。template class array array voidsetvalue unsigned index,const t value t getvalue unsignedindex const pri...
含有指標成員的類的拷貝
題目 下面是乙個陣列類的宣告與實現。請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。1 templateclass array29 10 array 1114 15void setvalue unsigned index,const t value 1620 21 t getvalue u...