浅拷贝和深拷贝
可能很多人都讲不知道这是深拷贝和浅拷贝是什么东西,现在我们用一个类中的
拷贝构造来说明,好的先看如下一个简单的例
子:
# define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<windows.h>
using namespace std;
class Array
{
public:
Array(int sz = 4)
:_sz(sz)
, _ptr(new int[_sz])
{
cout << "Arrar()" << endl;
}
//浅拷贝
Array(const Array& arr)
{
cout << "拷贝执行" << endl;
_ptr = arr._ptr;
_sz = arr._sz;
}
~Array()
{
cout << "~Array" << endl;
if (_ptr != NULL)
{
cout << _ptr << endl;
delete[] _ptr;
_ptr = NULL;
}
}
private:
int _sz;
int* _ptr;
};
int main()
{
Array d1;
Array d2(d1);
system("pause");
return 0;
}
这个例子呢,他是一个Array类,我们让他自己调用构造函数和拷贝函数,现在呢我们看看运行结果:
但是我们可以看出来这种方式看似简单好理解,但是它根本不够实用,发生错误的几率也很高。
这时候一个更牛逼的深拷贝出现了,
来我们看看深拷贝是如何实现的!!
# define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<windows.h>
using namespace std;
class Array
{
public:
Array(int sz = 4)
:_sz(sz)
, _ptr(new int[_sz])
{
cout << "Arrar()" << endl;
}
//深拷贝
Array(const Array& arr)
:_sz(arr._sz)
, _ptr(new int[_sz])
{
cout << "拷贝执行" << endl;
memcpy(_ptr, arr._ptr, _sz*sizeof(int));
}
~Array()
{
cout << "~Array" << endl;
if (_ptr != NULL)
{
cout << _ptr << endl;
delete[] _ptr;
_ptr = NULL;
}
}
private:
int _sz;
int* _ptr;
};
int main()
{
Array d1;
Array d2(d1);
system("pause");
return 0;
}
现在这个就是深拷贝的代码,我们改的只有拷贝构造函数,我们让_ptr指向一个我们新开辟的空间。
然后在实现的过程,再将上一个类的_ptr的内容利用memcpy函数拷贝进来,是不是完美解决?
来看看运行结果:
这就是原理,以后我们尽量使用深拷贝,浅拷贝反正不靠谱。。
转载请注明原文地址: https://ju.6miu.com/read-36548.html