C++深拷贝与浅拷贝的区别与实现

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值