- 深拷貝和淺拷貝可以簡(jiǎn)單理解為:如果一個(gè)類(lèi)擁有資源,當(dāng)這個(gè)類(lèi)的對(duì)象發(fā)生復(fù)制過(guò)程的時(shí)候,資源重新分配,這個(gè)過(guò)程就是深拷貝,反之,沒(méi)有重新分配資源,就是淺拷貝。
如果在類(lèi)中沒(méi)有顯式地聲明一個(gè)拷貝構(gòu)造函數(shù),那么,編譯器將會(huì)自動(dòng)生成一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),該構(gòu)造函數(shù)完成對(duì)象之間的位拷貝,位拷貝又稱(chēng)淺拷貝。故自定義拷貝構(gòu)造函數(shù)是一種良好的編程風(fēng)格,它可以阻止編譯器形成默認(rèn)的拷貝構(gòu)造函數(shù),提高源碼效率。
- 位拷貝,也就是把對(duì)象里的值完全復(fù)制給另一個(gè)對(duì)象,如B=A。這時(shí),如果A中有一個(gè)成員變量指針已經(jīng)申請(qǐng)了內(nèi)存,那B中的那個(gè)成員變量也指向同一塊內(nèi)存。這就出現(xiàn)了問(wèn)題:當(dāng)A把內(nèi)存釋放了(如:析構(gòu)),這時(shí)B內(nèi)的指針就是野指針了,出現(xiàn)運(yùn)行錯(cuò)誤。
自定義拷貝構(gòu)造函數(shù)舉例:
#include <iostream>
using namespace std;
class Example {
private:
int a;
public:
//構(gòu)造函數(shù)
Example(int b)
{ a = b;}
//拷貝構(gòu)造函數(shù)
Example(const Example &example)
{
a = example.a;
}
void Show ()
{
cout<<a<<endl;
}
};
int main()
{
Example A(100);
Example B = A; //注意這里的對(duì)象初始化要調(diào)用拷貝構(gòu)造函數(shù),而非賦值,等同于Example B(A);
B.Show ();
return 0;
}
這里的Example(const Example &example)就是自定義的拷貝構(gòu)造函數(shù),與構(gòu)造函數(shù)一樣,名字必須與類(lèi)名相同,只是其參數(shù)必須是該類(lèi)的對(duì)象的一個(gè)引用變量Example &example。