浅拷贝:没有自定义的拷贝构造函数,使用的是C++编译器自动产生的一个默认构造函数,默认的构造函数采用的是“位拷贝”,也就是浅拷贝,并不是“值拷贝”,也就是深拷贝。定义一个类 A,有A obj1; 不自定义拷贝构造函数时,即 A obj2(obj1) 或 A obj2 = obj1; 浅拷贝使得obj1和obj2指向同一块内存,调用析构函数时,要对同一个资源析构2次,即对同一块内存释放2次,这是错误的,如果对象中存在动态成员,即指针,在析构时会造成内存泄露,并且由于指向同一块内存,任何一方的变动都会影响到另一方。
深拷贝:防止编译器形成默认的构造函数,自定义拷贝构造函数,拷贝构造函数为成员变量申请了新的内存空间,obj1和obj2不再指向同一块内存。
我们来看下具体的简单实例吧。
#include
using namespace std;
class Array
{
public:
Array(int cnt)
{
m_Count = cnt;
m_Arr = new int[m_Count];
for (int i = 0; i < m_Count; i++)
{
m_Arr[i] = i + 1;
}
cout << "Array()" << endl;
}
Array(const Array &arr)
{
m_Count = arr.m_Count;
m_Arr = new int[m_Count];
for (int i = 0; i < m_Count; i++)
{
m_Arr[i] = arr.m_Arr[i]; //将arr申请的内存里的数据拷贝过来
}
cout << "Array &" << endl;
}
~Array()
{
delete[]m_Arr;
m_Arr = NULL;
cout << "~Array()" << endl;
}
void printAdd_arr()
{
cout << "m_Arr的值:" << m_Arr << endl;
}
void printArr()
{
for (int i = 0; i < m_Count; i++)
{
cout << m_Arr[i] << " ";
}
}
private:
int m_Count;
int *m_Arr;
};
int main()
{
Array arr(5);
Array arr1(arr); //使用自定义的拷贝构造函数
cout << "arr->";
arr.printAdd_arr();
arr.printArr();
cout << endl;
cout << "arr1->";
arr1.printAdd_arr();
arr1.printArr();
cout << endl;
return 0;
}