C 物件的構建 淺拷貝與深拷貝

2021-07-31 04:57:47 字數 1816 閱讀 9489

一、關於創造物件的時候初始值,物件的初始化值到底是多少,這個得看物件創造的是在**創造,假如沒有對建立的物件進行初始化,那麼它的初始值是多少呢?

(1)假如是在靜態儲存區,那麼就為0。

(2)假如是在棧上,或者是堆上,那麼就為隨機值

二、在生活中,物件都是初始化了之後才上市的,那麼問題就來了,程式如何對乙個物件進行初始化,下面給出兩種解決方案。

(1)在類中提供乙個public的initialize函式,創造物件後立即呼叫initialize函式進行初始化。下面是示例:

(2)但是這一種方式存在一定的問題,initialize只是乙個普通的函式,使用這一種方式的話,必須顯示呼叫initialize函式,假如不呼叫initialize函式,執行的結果也是不確定的。在c++中可以定義與類名相同的特殊成員函式,這種成員函式叫建構函式。

注意:每個物件在使用之前都應該初始化;類的建構函式用於物件的初始化;

建構函式與類同名並沒有返回值;建構函式在物件定義時自動被呼叫。

三、兩個特殊的建構函式

無參建構函式:

在當類中沒有定義建構函式的時候,編譯器預設提供乙個無參建構函式,而且函式體為空滴。

拷貝建構函式(也可以理解為有參建構函式):

在當類中沒有定義拷貝建構函式的時候,編譯器預設提供乙個拷貝建構函式,簡單的進行成員變數值得複製。

但是拷貝建構函式也分為淺拷貝和深拷貝

淺拷貝:拷貝後的物理狀態相同

深拷貝:拷貝後物件的邏輯狀態相同

(注意:編譯器提供)

思考乙個問題:什麼時候需要進行深拷貝呢?

物件中有成員指代了系統資源

成員指向了動態記憶體的空間

成員開啟了外存中的檔案

成員使用了系統中的網路埠

總結:

下面以:開發乙個陣列類解決原生陣列的安全性問題為例解說一下深度拷貝

intarray.h:

class intarray

;

intarray.cpp:

intarray::intarray(int len)

m_length = len;

}intarray::intarray(const intarray& obj)

bool intarray::get(int index, int& value)

return ret;

}bool intarray::set(int index, int

value)

return ret;

}void intarray::free()

main.cpp

int main()

for(int i=0; iint

value = 0;

if( a.get(i, value) )

}intarray b = a;

for(int i=0; iint

value = 0;

if( b.get(i, value) )

}a.free();

b.free();

return

0;}

js 物件深拷貝 深拷貝與淺拷貝

前言 最近在複習一些面試的知識點,剛剛好複習到了這一部分,於是就寫下這篇文章記錄一下。一 值型別和引用型別 在學習深拷貝和淺拷貝之前,我們先來了解一下js的變數型別。值型別 vs 引用型別 值型別 值型別主要有 number,string,boolean,symbol,null,undefined ...

物件的淺拷貝與深拷貝

工作中可能會遇到這樣乙個問題,我明明把資料拷貝了乙份,但改變拷貝後的資料居然同時會改變原始資料中的值。那就來看看為什麼吧,希望這篇文章可以給你解惑。只拷貝了資料物件的第一層,深層次的資料值與原始資料會互相影響 拷貝後的資料與原始資料還存有關聯 常見淺拷貝的方式 object.assign 擴充套件運...

C 深拷貝 與 淺拷貝

最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...