C E 聚集 深淺拷貝

2021-10-08 07:56:06 字數 1163 閱讀 9799

概念:

類的成員中含有某類的指標或者引,這種類間關係叫做類的聚集。又稱為「遠端所有權」。該類的物件將資料存放在資料外面,物件只存放物件的位址或別名。資料可以是陣列,別的類的物件等。

聚集類建構函式:

在建構函式中一定要對指標初始化,若尚未確定指向,應置 null;但若類的聚集是用引用實現的,則不能不確定指向。

聚集類賦值函式:

在賦值函式中,應首先申請一塊新空間,把新值送進去,然後釋放原來的空間;

//例子:(string類為例)

string& string::

operator=(

const string& rhs)

}return

*this

;}

(自賦值:自身使用賦值函式給自身賦值)

聚集類拷貝建構函式:

使用動態儲存分配的類一定要重寫拷貝建構函式,

//例子:

string::string (

const string & rs )

else

}}

聚集類析構函式:

釋放指標所指空間,但若是使用引用實現聚集,則不必釋放。(注意:不可釋放未經初始化的指標,但是刪除乙個null指標則沒問題)

實現物件間資料元素的一一對應複製。這是拷貝建構函式的本能。

當資料元素是指標的時候,但是一一對應複製則出問題了。其結果是多個物件的指標指向同一塊資料區。當沒有顯式給出拷貝建構函式時,編譯器將彌補乙個拷貝建構函式,其功能僅能完成淺拷貝。

深拷貝:當被複製的物件的資料成員是指標或引用時,不是複製該指標成員本

身,而是將指標所指的物件(區域)進行複製。物件的指標各指向自己的那份。

這裡引用乙個笑話:

一天,你到某飯店打算用餐。看到一位先生正津津有味地吃著你叫不上來名字的美味食品。你叫來侍者,說:「給我來乙份那位先生正在吃的東西。」於是忠實的侍者將那位先生正在吃的東西搶來,送到你面前——因為你要乙份「那位先生正在吃的東西」!這就是淺拷貝

而正確的做法是,侍者去廚房叫廚師做乙份一模一樣的菜餚給你,這就是深拷貝。

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...

拷貝和深淺拷貝

當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...

12 深淺拷貝

複製物件的基本概念 複製乙個物件作為副本,它會開闢一塊新的記憶體 堆記憶體 來儲存副本物件,就像複製檔案一樣.即源物件和副本物件是兩塊不同的記憶體區域.物件具備複製功能,必須實現協議,協議.常用的可複製物件有 nsnumber,nsstring,nsarray,nsdictionary.nsmuta...