概念:類的成員中含有某類的指標或者引,這種類間關係叫做類的聚集。又稱為「遠端所有權」。該類的物件將資料存放在資料外面,物件只存放物件的位址或別名。資料可以是陣列,別的類的物件等。
聚集類建構函式:
在建構函式中一定要對指標初始化,若尚未確定指向,應置 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...