您好,登錄后才能下訂單哦!
這篇文章主要介紹“c++深拷貝與淺拷貝是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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]; //指針數組,動態的用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!!!
//修改后,發現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++深拷貝與淺拷貝是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。