C++深拷贝与浅拷贝的区别与实现
在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。
背景:
如果不主动编写拷贝构造函数与赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数,如果类中含有指针参数,就会隐藏错误:以类String的两个对象来说,假设a.data的内容为 A , b.data的内容为 B 。
1.两个指针对象会指向同一区域的内存,会彼此影响。
2.将a.data赋值给b.data的时候,b.data原来的内存未被释放,造成内存泄漏。
3.对象在析构释放内存时,data会被释放两次。
!!!常将 拷贝构造对象语句写为:
String a(b); //方便区分赋值语句
构造函数与拷贝构造函数的具体实现:
//构造函数
Array::Array(int count)
{
m_iCount = count;
m_pArr = new int[m_iCount]; //开辟内存空间
for(int i=0;i<m_iCount;i++)
{
m_pArr[i] = i;
}
cout<<"Array"<<endl;
}
//拷贝构造函数
Array::Array(const Array& arr)
{
m_pArr = arr.m_pArr; //对象赋值
m_pArr = new int[m_iCount]; //拷贝构造另辟内存空间
for(int i=0;i<m_iCount;i++)
{
m_pArr[i] = arr.m_pArr[i];
}
cout<<"Array &"<<endl;
}
//析构函数
Array::~Array()
{
delete []m_pArr;
m_pArr = NULL;
cout<<"~Array"<<endl;
}