在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是一样的,只是存储在不同的地方。这就是深拷贝。