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;}
但是我们可以看出来这种方式看似简单好理解,但是它根本不够实用,发生错误的几率也很高。
这时候一个更牛逼的深拷贝出现了,来我们看看深拷贝是如何实现的!!
# 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
- Object-c 深拷贝和浅拷贝
- [Objective-C]浅拷贝和深拷贝
- 【C++】深拷贝和浅拷贝
- 【C++】深拷贝和浅拷贝
- Objective-C浅拷贝和深拷贝
- 【C++】深拷贝和浅拷贝解析
- C中的深拷贝和浅拷贝
- [c++]深拷贝和浅拷贝
- 【C++】深拷贝、浅拷贝和写时拷贝
- object c的浅拷贝(地址拷贝)和深拷贝(对象拷贝)
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- Leetcode divide & conquer || Different Ways to Add Parentheses
- js 文件的加载解析
- Mysql和服务器相连接的部分代码
- 设计模式---简单工厂模式(c++实现)
- java重载和重写的区别(转)
- C++ -浅拷贝和深拷贝
- HTML5新的API
- 204. Count Primes(埃拉托色尼)
- BC范式介绍
- 密码学综述
- 测鬼记(上)——报到(二)
- JDK、JRE、JVM三者的区别
- Linux系统与Windows系统中的回车与换行问题
- LeetCode上Roman to Integer的C++代码