问题:C++浅拷贝的通俗理解

转自知乎:点击进入原文 原文写的非常好,在原文的基础上我附录了一张示意图以便各位可以更加形象的了解

作者:蓝***r>链接:https://www.zhihu.com/question/36370072/answer/67181275

      这个问题其实答案很简单,而且基本上每一本C++书都会提及,但是或许对于初学者并不那么容易的理解,所以我想尝试以我的比喻来讲解。

      我认为浅拷贝是一个不喜欢思考的懒汉,而深拷贝则是一个思维严谨,喜欢思考的人。对于懒汉来说,虽然给了他任务,但是他总是想尽量的少做一些事情,所以很多时候做出来的东西就是只看到了表面,不会去思考对不对。

//没有指针变量的结构体
struct X
{
  int x;
  int y;
};

对于懒汉来说,他很直白的看到了x,看到了y,然后就拷贝x和y,然后就不管了,反正我完成我的拷贝了,至于对不对,我不管。

而一旦有了引用或者指针,事情就不一样了
//具有指针变量的结构体
struct X
{
  int x;
  int y;
  int* p;
};
      懒汉依然只是直接表面级别的拷贝,于是拷贝x, y , p,但是他没有思考接下来的事情对不对。对于指针或者引用来说,若是只是拷贝表面,那么拷贝后的物体的指针也和原来的指针指向的是同一个对象,所以虽然目的想完成一个完美的克隆体,但是却发现克隆体和原来的物体中间还有一根线连着,没有完美的分离。
//指针的拷贝
int *p = new int(47);
int *q = p;

      如q与p都是指向一个物体一样。

      那么如果原来的物体销毁了,但是现在拷贝的物体还在,那么这时候你拷贝后的物体的成员指针就是一个悬挂指针,指向了不再存在的物体,那么你访问的话,那就不知道会发生什么了。

      而对于深拷贝,这一个勤奋的人,他不会只做表面,他会把每一个细节都照顾好。于是,当他遇到指针的时候,他会知道new出来一块新的内存,然后把原来指针指向的值拿过来,这样才是真正的完成了克隆体和原来的物体的完美分离,如果物体比作人的话,那么原来的人的每一根毛细血管都被完美的拷贝了过来,而绝非只是表面。所以,这样的代价会比浅拷贝耗费的精力更大,付出的努力更多,但是是值得的。当原来的物体销毁后,克隆体也可以活的很好。

      然而事实上是这个世界上大多都是懒汉,包括编程的人,编译器等,所以默认的行为都是浅拷贝,于是有时候你需要做一个勤奋的人,让事情做正确,自己去完成深拷贝所需要的事情。
附:示意图