拷贝构造函数就是当你的的类的数据成员中存在指针成员的时候,就要自己定义它,因为编译器往往采用位拷贝,也就是一个内存块一位一位的复制过去,这样就造成多个对象的指针成员都指向同一块内存区域,恰恰危险就出在这里,每个对象都认为自己独占这块内存,因此当一个对象销毁时,如果它把这块内存一同delete的话,那么其他对象的指针成员就会造成访问违规。不过如果你的数据成员中没有指针的话,你也就没有必要进行定义,因为编译器知道如何去进行优化,一旦你定义了,编译器就只能进行函数的调用了,无法优化。下面是一个类维护申请动态二维数组的例子:
class Copy { private: int** element; int m; int n; public: Copy(int,int); //普通构造函数 Copy(const Copy&); //拷贝构造函数 };
Copy::Copy(int m,int n) { int** element=new int*[m]; //申请第一维空间,即指针数组 for(int i=0;i<m;+i) element[i]=new int[n]; //申请第二维空间,即每一个指针都分配一个数组空间 m=m; n=n; }
Copy::Copy(const Copy& reset) { for(int i=0;i<m;++i) delete[] element[i]; //删除原来申请的空间指针变量 delete[] element;
m=reset.m; n=reset.n;
element=new int*[reset.m]; //重新申请一片空间创建动态二维指针 for(int j=0;j<m;++j) element[j]=new int[reset.n];
///// then copy elements...... }