拷贝构造函数----深拷贝、浅拷贝
【何时调用拷贝构造函数】:
1-函数的参数时该对象时(按值传入)
2-函数的返回值是该对象时
3-该类对象的其中一个对象需要通过另一个对象进行初始化时。
【浅拷贝复制的缺陷】:
当复制的对象为
动态申请内存
的对象时,浅拷贝复制的对象,乍一看时对象进行了复制,其实是对其指针进行了复制。
既,对象的内容没真正的拷贝过去,而是将其地址拷贝了过去。
此时若对原始对象进行修改,复制后的对象也会改变(相当于通过指针进行改变),出错!
同时,释放内存时,相当于动态分配指针的内存区域释放了两次(二者占有同一份内存空间,都是对同一个指针进行了释放),导致运
行错误!
【解决方法】:
1-自己编写拷贝构造函数,实现深拷贝。
2-自己编写析构函数,实现对不同内存区域的释放。
【深拷贝构造函数】:
就是对复制对象的每个元素进行复制,而不是仅仅复制指针。
例如:
Matrix::Matrix(const Matrix& a)
{
int i, j;
{
int i, j;
m = new int*[a.lines];
for (i = 0;i < a.lines;i++)
m[i] = new int[a.rows];
for (i = 0;i < a.lines;i++)
m[i] = new int[a.rows];
for (i = 0;i < a.lines;i++)
for (j = 0;j < a.rows;j++)
m[i][j] = a.m[i][j];
}
for (j = 0;j < a.rows;j++)
m[i][j] = a.m[i][j];
}