對象的構造,也可以由複製構造函數完成,即用一個對象的內容去初始化另一個對象的內容。此時,若對象使用了堆空間(注意和“堆對象”區分),就有深、淺複製的問題,不清楚則很容易出錯。
什麼是淺複製
缺省複製構造函數:用一個對象的內容初始化另一個同類對象,也稱爲缺省的按成員拷貝,不是對整個類對象的按位拷貝。這種複製稱爲淺複製。
class CGoods
{
char *Name; //不同與char Name[21] ?
int Amount;
float Price;
float Total_value;
public:
CGoods()
{
Name=new char[21];
}
CGoods(CGoods & other)
{ //缺省拷貝構造內容:
this->Name=other.Name;
this->Amount=other.Amount;
this->Price=other.Price;
this->Total_value=other.Total_value;
}
~CGoods()
{
delete Name;
}//析構函數
}; //類聲明結束
淺複製可能帶來什麼問題
void main()
{
CGoods pc; //調用缺省構造函數
CGoods pc1(pc); //調用複製構造函數
} //程序執行完,對象pc1和pc先後析構,此時出錯。
出現錯誤的原因:析構時,如果用缺省析構,則動態分配的堆空間不能回收。如果用有“delete Name;”語句的析構函數,則先析構pc1時,堆空間已經釋放,然後再析構pc時出現了二次釋放的問題。
解決方法:重新定義複製構造函數,給每個對象獨立分配一個堆字符串,稱深複製。
深複製——自定義複製構造函數
CGoods(CGoods & other)
{ //自定義拷貝構造
this->Name=new char[21];
strcpy(this->Name,other.Name);
this->Amount=other.Amount;
this->Price=other.Price;
this->Total_value=other.Total_value;
}
面試:C++的深複製和淺複製(轉)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.