文章概述
1.淺拷貝和深拷貝 上一篇文章中,我們提到必要的時候必須手動的寫拷貝構(gòu)造函數(shù)。那什么是必要的時候,我們這篇文章分析。
淺拷貝和深拷貝
我們首先要知道默認(rèn)拷貝構(gòu)造函數(shù)可以完成對象的數(shù)據(jù)成員簡單的復(fù)制,這也稱為淺拷貝。對象的數(shù)據(jù)資源是由指針指向的堆時,默認(rèn)的拷貝構(gòu)造函數(shù)只是將指針復(fù)制。 a. 我們首先分析下面的代碼為什么會出錯??
class Test
{
private:
int* p;
public:
Test(int x)
{
this->p=new int(x);
cout << '對象被創(chuàng)建' << endl;
}
~Test()
{
if (p != NULL)
{
delete p;
}
cout << '對象被釋放' << endl;
}
int getX() { return *p; }
};
int main()
{
Test a(10);
//會調(diào)用默認(rèn)的拷貝構(gòu)造函數(shù)
Test b = a;
return 0;
}
我們畫一個示意圖分析: 看懂了示意圖,我們知道為什么會出錯了(同一個內(nèi)存被釋放兩次)。我們接下來分析解決方案:
class Test
{
private:
int* p;
public:
Test(int x)
{
this->p=new int(x);
cout << '對象被創(chuàng)建' << endl;
}
~Test()
{
if (p != NULL)
{
delete p;
}
cout << '對象被釋放' << endl;
}
int getX() { return *p; }
//深拷貝(拷貝構(gòu)造函數(shù))
Test(const Test& a)
{
this->p = new int(*a.p);
cout << '對象被創(chuàng)建' << endl;
}
//淺拷貝(拷貝構(gòu)造函數(shù))
//Test(const Test& a)
//{
// this->p = a.p;
// cout << '對象被創(chuàng)建' << endl;
//}
};
int main()
{
Test a(10);
//我們手動的寫拷貝構(gòu)造函數(shù),C++編譯器會調(diào)用我們手動寫的
Test b = a;
return 0;
}
總結(jié): 淺拷貝會把指針變量的地址復(fù)制; 深拷貝會重新開辟內(nèi)存空間。
|