seo网站建设 大时代,网站建设原因,天津建设工程信息网天津,公众号微信平台官网问题
深拷贝和浅拷贝的区别是面试中的常见问题之一#xff0c;对于不同的编程语言#xff0c;这个问题的回答可能稍有差别#xff0c;下面我们就来探索一下它们之间的异同吧。
先来看看在JavaScript对象的深拷贝与浅拷贝的区别#xff1a;
浅拷贝#xff1a;只是复制了…问题
深拷贝和浅拷贝的区别是面试中的常见问题之一对于不同的编程语言这个问题的回答可能稍有差别下面我们就来探索一下它们之间的异同吧。
先来看看在JavaScript对象的深拷贝与浅拷贝的区别
浅拷贝只是复制了指向某个对象的指针而不是复制对象本身因此浅拷贝后新旧对象还是共用同一块内存旧对象改变会修改新对象的值。
深拷贝会另外构造一个与旧对象一模一样的对象新旧对象不共享内存旧对象改变不会修改新对象的值。 理解了上面的内容可以说已经理解了深拷贝和浅拷贝的本质区别了。但是如果面试官是问你在C中深拷贝和浅拷贝是和拷贝的区别上面的回答可能还不能让面试官满意哦。在C中要说出深拷贝和浅拷贝的区别想必是需要提到拷贝构造函数这个概念才能让面试官满意的。既然如此那我们就不妨来看看C中怎么说的吧。
浅拷贝
浅拷贝也称为位拷贝。C中的浅拷贝是通过拷贝构造函数来实现的如果程序员不主动编写拷贝构造函数和赋值函数编译器将以浅拷贝的方式自动生成缺省的函数也就是在拷贝时简单地复制某个对象的指针这样很容易造成一些问题。
例如假设String类有两个对象a和ba.data的内容为“hello”b.data为“world”当将a的值赋给b时可能会出现以下3个问题
① b.data的内存没释放造成内存泄漏
② b.data和a.data指向了同一块内存a或b任何一方的值改变都会修改另一方的值
③ 在对象被析构时data被释放了两次
看看下面的代码来理解一下
//假设有一个String类
String a(hello);
String b(world);
//调用了拷贝构造函数不过这里最好写成 string c(a)a原本的内存没有释放且a或c改变都会影响另一方
String c a;
cb; //调用了赋值函数深拷贝
深拷贝必须显示地提供拷贝构造函数和赋值运算符而且新旧对象不共享内存也就是说在编写拷贝构造函数时会开辟一个新的内存空间。那什么时候会使用深拷贝
①一个对象以值传递的方式传入函数体
②一个对象以值传递的方式从函数体返回
③一个对象需要通过另外一个对象进行初始化
总结
C中浅拷贝不需要自己实现编译器会自动生成缺省的拷贝构造函数浅拷贝新旧对象共享一块内存任何一方的值改变都会影响另一方深拷贝需要自己手动编写拷贝构造函数深拷贝新旧对象不共享内存。
参考资料
浅拷贝与深拷贝的区别
C细节 深拷贝和浅拷贝(位拷贝详解