面試:C++的深複製和淺複製(轉)

對象的構造,也可以由複製構造函數完成,即用一個對象的內容去初始化另一個對象的內容。此時,若對象使用了堆空間(注意和“堆對象”區分),就有深、淺複製的問題,不清楚則很容易出錯。
 什麼是淺複製
 缺省複製構造函數:用一個對象的內容初始化另一個同類對象,也稱爲缺省的按成員拷貝,不是對整個類對象的按位拷貝。這種複製稱爲淺複製。

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;
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章