4 8C 深複製 淺複製 寫時複製

2021-09-17 04:47:45 字數 1937 閱讀 9773

1.複製建構函式(拷貝建構函式)

作用:用乙個已經生成的物件來初始化另乙個同類的物件。

一般形式

類名(const 類名&obj)
e.g.

class point

//複製建構函式

};

物件賦值

物件複製

先定義了物件,再(對已經存在的物件)進行賦值

從無到有地建立乙個新物件,並使它與乙個已存在物件相同

2.合成複製建構函式

成員型別->複製含義:

①內建型別成員直接複製其值;

②類型別使用該類的複製建構函式進行複製;

③陣列->複製陣列每個元素。

如果沒有為類型別陣列提供元素初始化式,則將用預設建構函式初始化每個元素。然而,如果使用常規的大括號的陣列初值列表形式來初始化陣列時,則使用複製建構函式來初始化每個元素。

複製建構函式作用:函式可以傳遞物件和返回物件,物件陣列才能用初值列表的形式初始化。

(疑問:怎麼用初值列表對物件陣列進行初始化)

缺點:容易將同一分配空間delete兩次

自己定義複製建構函式->實現深複製

(文字描述**自matrix)

1.寫時複製(copy-on-write):當你讀取到這個空間的時候,並不會開闢出乙個一模一樣的空間出來給你,當你真正需要拷貝的時候,那麼他就會開闢出空間給你。也就是拖延版的深拷貝。

寫時複製(是通過"引用計數"實現的,在分配空間的時候多分配4個位元組,用來記錄有多少個指標指向塊空間,當有新的指標指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數減一(假裝釋放),直到引用計數減為0時才真的釋放掉這塊空間。當有的指標要改變這塊空間的值時,再為這個指標分配自己的空間(注意這時引用計數的變化,舊的空間的引用計數減一,新分配的空間引用計數加一)

寫時複製的好處是結合和淺拷貝深拷貝的優點,對唯讀物件,可以十分迅速的完成物件拷貝,對需要修改的物件,可以延遲到實際修改的時候才進行記憶體空間的申請,分攤了系統呼叫的時間。

完成乙個棧類,棧的複製採用寫時複製規則注意記憶體**

下圖是寫時複製的示意圖。

第一步:有物件s1, 指向乙個記憶體空間 [3, 2, 1],該空間的計數器為1,表示只有乙個物件指向該空間

第二步:s2 = s1, 此時s2和s1共同指向乙個記憶體空間,採用淺拷貝規則,該空間計數器為2,表示有兩個物件指向該空間

第三步:當s1或s2需要改變資料時(比如,s2出棧),那麼改變資料的物件進行深拷貝後再執行改變資料操作

當記憶體空間計數器 1->0 時,需要對該記憶體空間進行**

淺複製 深複製

second,來說說shallow copy and deep copy的定義和我自己的一些理解。僅供參考 淺複製 shallow copy 如果欄位是值型別的。則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件 因此,原始物件及其副本引用同一物件。即被複製物件的所有變數都含有...

深複製 淺複製

深複製又叫深拷貝 淺複製又叫淺拷貝 位拷貝。為了理解什麼叫深複製和淺複製,我們舉乙個例子,假如我們有乙個類叫cdemo,有兩個成員,a 和 str.class cdemo 我們再定義乙個建構函式 cdemo int pa,char cstr 然後執行 cdemo a 10,hello cdemo b...

深複製淺複製

淺複製 所謂的淺拷貝就是拷貝指向物件的指標,意思就是說 拷貝出來的目標物件的指標和源物件的指標指向的記憶體空間是同一塊空間.淺拷貝只是一種簡單的拷貝,讓幾個物件公用乙個記憶體,然而當記憶體銷毀的時候,指向這個記憶體空間的所有指標需要重新定義,不然會造成野指標錯誤 深複製所謂的深拷貝指拷貝物件的具體內...