一、關於創造物件的時候初始值,物件的初始化值到底是多少,這個得看物件創造的是在**創造,假如沒有對建立的物件進行初始化,那麼它的初始值是多少呢?
(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 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...