拷贝构造函数使用情况

    在C++中,有一个拷贝构造函数的概念,当一个对象通过构造函数初始化之后,如果需要一个和它一样的对象,这个对象是临时的,比如:1 函数返回一个对象,这个对象就是一个拷贝;2 对象做函数的形参,传过来的实参对象就是一个拷贝。3 用一个同类对象去初始化另一个对象时候,Point A(1,2),Point B(A). B对象就是通过拷贝构造函数产生的。

    一般来说,拷贝构造函数是默认的,系统会自动调用,如果要新建一个和一个对象有一点不同的对象,也就是说在这个对象的基础上再改造一下,那么就要自己亲自写拷贝构造函数。或者,类的数据成员中有指针类型时,默认的构造函数只能实现一个浅拷贝,要实现一个深拷贝必须自己书写拷贝构造函数

    拷贝构造函数的格式:

    Point(Point &p){ X=p.X; Y=p.Y;}

   关于浅拷贝和深拷贝,如果我们要把一个数组对象A,使用系统默认的拷贝构造函数初始化B,如下代码:

    template <class T>
Array<T>::Array(const Array<T> &X)
{
   size=X.size;
   alist=X.alist;
}

void main()
{
   Array<int> A(10);
   Array<int> B(A);
}

这样的话,B对象就是A对象一个浅拷贝,也就是说,A,B公用一段内存快,这样会造成很大的问题,如果做析构的时候,A,B所占的内存区域将被释放2次,这会引起错误。为了避免这种错误,应该自定义拷贝构造函数,代码如下:

 template <class T>
Array<T>::Array(const Array<T> &X)
{
   int n=X.size;
   size=n;
   alist=new T[n];
   if(alist == NULL)
   {
       Error(memoryAllocationError);
   }
   T* srcptr = X.alist;
   T* destptr = alist;
   while(n--)
   {
      *destptr++ = *srcptr++;
   }
}

这样就构造了另一块内存区域,和A是一样的,只是存储在不同的地方。这就是深拷贝。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值