溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++深拷貝與淺拷貝是什么

發(fā)布時間:2022-03-17 13:47:28 來源:億速云 閱讀:110 作者:iii 欄目:大數據

這篇文章主要介紹“c++深拷貝與淺拷貝是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“c++深拷貝與淺拷貝是什么”文章能幫助大家解決問題。

復制構造函數也叫拷貝構造函數;
淺復制也叫淺拷貝或位拷貝;
深復制也叫深拷貝;
淺拷貝和深拷貝
拷貝就是復制,創(chuàng)建副本。假設有對象A,A有屬性t1,t2。那么,我通過拷貝A,得到B,B應該也有屬性t1,t2,且A、B兩個對象的每個屬性,都應該是相同的。
對于基本類型的屬性t1,拷貝是沒有疑義的。簡單將值復制一份,就達到了拷貝的效果。而對于引用類型的屬性t2來說,拷貝就有了兩層含義。
第一層是,我只是將t2引用的地址復制一份給B的t2,確實達到了屬性相同的效果,可以理解為實現了拷貝,但是事實上,兩個對象中的屬性t2對應的是同一個對象。在B對象上對t2所指向的對象進行操作,就會影響到A對象中的t2的值。
第二層是,我將A的t2所指向的對象,假設為o1,完整復制一份,假設為o2,將新的o2的地址給B的t2。也達到了復制的效果,且對B的t2所指向的o2進行操作,不會影響到A的t2所指向的o1。
拷貝的兩層含義,對應了淺拷貝和深拷貝的概念,做了第一層,就是淺拷貝,做到第二層,就是深拷貝。

c++深拷貝與淺拷貝是什么

基于以上內容,很容易可以想到,淺拷貝比深拷貝要更快,但是,從拷貝的意義上來看,淺拷貝相較于深拷貝,要欠缺一點。

實例如下:

#include <iostream>using namespace std;//20200430 公眾號:C語言與CPP編程
class CopyDemo{public:  CopyDemo(int pa,char *cstr)  //構造函數,兩個參數  {     this->a = pa;     this->str = new char[1024]; //指針數組,動態(tài)的用new在堆上分配存儲空間     strcpy(this->str,cstr);    //拷貝過來  }
//沒寫,C++會自動幫忙寫一個復制構造函數,淺拷貝只復制指針,如下注釋部分  //CopyDemo(CopyDemo& obj)    //{  //   this->a = obj.a;  //  this->str = obj.str; //這里是淺復制會出問題,要深復制  //}
 CopyDemo(CopyDemo& obj)  //一般數據成員有指針要自己寫復制構造函數,如下  {     this->a = obj.a;    // this->str = obj.str; //這里是淺復制會出問題,要深復制     this->str = new char[1024];//應該這樣寫     if(str != 0)        strcpy(this->str,obj.str); //如果成功,把內容復制過來  }
 ~CopyDemo()  //析構函數  {     delete str;  }
public:     int a;  //定義一個整型的數據成員     char *str; //字符串指針};
int main(){  CopyDemo A(100,"hello!!!");
 CopyDemo B = A;  //復制構造函數,把A的10和hello!!!復制給B  cout <<"A:"<< A.a << "," <<A.str << endl;  //輸出A:100,hello!!!  cout <<"B:"<< B.a << "," <<B.str << endl;  //輸出B:100,hello!!!
 //修改后,發(fā)現A,B都被改變,原因就是淺復制,A,B指針指向同一地方,修改后都改變  B.a = 80;  B.str[0] = 'k';
 cout <<"A:"<< A.a << "," <<A.str << endl;  //輸出A:100,kello!!!  cout <<"B:"<< B.a << "," <<B.str << endl;  //輸出B:80,kello!!!
 return 0;}

根據上面實例可以看到,淺復制僅復制對象本身(其中包括是指針的成員),這樣不同被復制對象的成員中的對應非空指針會指向同一對象,被成員指針引用的對象成為共享的,無法直接通過指針成員安全地刪除(因為若直接刪除,另外對象中的指針就會無效,形成所謂的野指針,而訪問無效指針是危險的;除非這些指針有引用計數或者其它手段確保被指對象的所有權);而深復制在淺復制的基礎上,連同指針指向的對象也一起復制,代價比較高,但是相對容易管理。

關于“c++深拷貝與淺拷貝是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI