C++ -浅拷贝和深拷贝

来源:互联网 发布:影楼设计软件 编辑:程序博客网 时间:2024/06/10 18:36

            浅拷贝和深拷贝

可能很多人都讲不知道这是深拷贝和浅拷贝是什么东西,现在我们用一个类中的
拷贝构造来说明,好的先看如下一个简单的例子:

# 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函数拷贝进来,是不是完美解决?
来看看运行结果:



这就是原理,以后我们尽量使用深拷贝,浅拷贝反正不靠谱。。

1 0