函式返回含有指標成員的物件

2021-10-06 06:25:23 字數 1785 閱讀 9862

移動構造

淺層複製只實現物件間的資料元素一一對應,只複製成員函式中的指標位址,如下圖: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...