如何理解 C++ 中的深拷贝和浅拷贝?
来源:网络整理 网络用户发布,如有版权联系网管删除 2018-09-04
这个问题其实答案很简单,而且基本上每一本C++书都会提及,但是或许对于初学者并不那么容易的理解,所以我想尝试以我的比喻来讲解。
我认为浅拷贝是一个不喜欢思考的懒汉,而深拷贝则是一个思维严谨,喜欢思考的人。对于懒汉来说,虽然给了他任务,但是他总是想尽量的少做一些事情,所以很多时候做出来的东西就是只看到了表面,不会去思考对不对。
struct X
{
int x;
int y;
};
对于懒汉来说,他很直白的看到了x,看到了y,然后就拷贝x和y,然后就不管了,反正我完成我的拷贝了,至于对不对,我不管。
而一旦有了引用或者指针,事情就不一样了
struct X
{
int x;
int y;
int* p;
};
int *p = new int(47);
int *q = p;
如q与p都是指向一个物体一样。
那么如果原来的物体销毁了,但是现在拷贝的物体还在,那么这时候你拷贝后的物体的成员指针就是一个悬挂指针,指向了不再存在的物体,那么你访问的话,那就不知道会发生什么了。
而对于深拷贝,这一个勤奋的人,他不会只做表面,他会把每一个细节都照顾好。于是,当他遇到指针的时候,他会知道new出来一块新的内存,然后把原来指针指向的值拿过来,这样才是真正的完成了克隆体和原来的物体的完美分离,如果物体比作人的话,那么原来的人的每一根毛细血管都被完美的拷贝了过来,而绝非只是表面。所以,这样的代价会比浅拷贝耗费的精力更大,付出的努力更多,但是是值得的。当原来的物体销毁后,克隆体也可以活的很好。
然而事实上是这个世界上大多都是懒汉,包括编程的人,编译器等,所以默认的行为都是浅拷贝,于是有时候你需要做一个勤奋的人,让事情做正确,自己去完成深拷贝所需要的事情。
查看评论 回复
"如何理解 C++ 中的深拷贝和浅拷贝?"的相关文章
- 上一篇:如何用6个月搞定C++
- 下一篇:C++的反思