我的主題是,每天積累一點點。
****************************************===
在類定義中,如果沒有提供自己的拷貝建構函式,則c++提供乙個預設拷貝建構函式。
c++提供的預設拷貝建構函式的工作方法是:完成乙個成員乙個成員的拷貝。如果成員是類物件,則呼叫其拷貝建構函式或者預設拷貝建構函式。需要注意的是,預設拷貝建構函式不會處理靜態成員變數。
簡單的自定義拷貝建構函式:
class studentprotected:
int a;
};
如上,我們拷貝的策略是乙個乙個成員的拷貝,但是如果乙個類擁有資源,當其建構函式分配了乙個資源(如堆記憶體),而拷貝建構函式沒有去分配該資源,那麼兩個物件都擁有同乙個資源,這稱為淺拷貝。
淺拷貝的乙個問題是,當物件析構的時候,該資源將經歷兩次資源返還。比如下面這樣子:
class person
{public:
person(char* pn)
{ cout<<"constructing"《可以看到,第二次釋放資源的時候,出錯了。因為預設拷貝建構函式並沒有分配新的資源。
所以我們需要自定義拷貝建構函式,並分配資源,使拷貝和被拷貝的物件指向不同的資源,這就是深拷貝的概念。c++提供的預設拷貝建構函式就是淺拷貝。
具體如下:
class person
{public:
person(char* pn)
{ cout<<"constructing"《堆記憶體是最常用的需要構造拷貝的資源,還有其它資源,比如檔案的開啟,裝置的占有(如印表機)服務業需要深拷貝。
乙個很好的經驗是:如果你的類需要析構函式來釋放資源,那麼它也需要乙個拷貝建構函式(深拷貝的方式)。
C 基礎 02 深拷貝和淺拷貝
我的主題是,每天積累一點點。在類定義中,如果沒有提供自己的拷貝建構函式,則c 提供乙個預設拷貝建構函式。c 提供的預設拷貝建構函式的工作方法是 完成乙個成員乙個成員的拷貝。如果成員是類物件,則呼叫其拷貝建構函式或者預設拷貝建構函式。需要注意的是,預設拷貝建構函式不會處理靜態成員變數。簡單的自定義拷貝...
02 淺拷貝 深拷貝
1.深拷貝是指源物件與拷貝物件互相獨立,其中任何乙個物件的改動都不會對另外乙個物件造成影響。舉個例子,乙個人名叫張三,後來用他轉殖 假設法律允許 了另外乙個人,叫李四,不管是張三缺胳膊少腿還是李四缺胳膊少腿都不會影響另外乙個人。比較典型的就是value 值 物件,如預定義型別int32,double...
C 淺拷貝和深拷貝
class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...