深浅拷贝在MDN官方中的表述是这样的:
对象的深拷贝是指其属性与其拷贝的源对象的属性不共享相同的引用(指向相同的底层值)的副本。因此,当你更改源或副本时,可以确保不会导致其他对象也发生更改;也就是说,你不会无意中对源或副本造成意料之外的更改。这种行为与浅拷贝的行为形成对比,在浅拷贝中,对源或副本的更改可能也会导致其他对象的更改(因为两个对象共享相同的引用)。
对象的浅拷贝是其属性与拷贝源对象的属性共享相同引用(指向相同的底层值)的副本。因此,当你更改源或副本时,也可能导致其他对象也发生更改——也就是说,你可能会无意中对源或副本造成意料之外的更改。这种行为与深拷贝的行为形成对比,在深拷贝中,源和副本是完全独立的。
简单来说,深拷贝是指将对象的属性和方法都拷贝一份,然后存储到另外一个地址,这样的话,无论你怎么修改原对象,拷贝之后的值都不会改变的
而浅拷贝是仅拷贝一份原函数的地址,传给调用函数。这样的话,调用的对象还是原对象的地址存放的值,故在修改对象方法或属性时会改变原对象。
学过C语言的都知道函数当中有两种调用参数方式,分别是传值调用和引用调用它和深浅拷贝有异曲同工之妙,其中,传值调用是将原来对象的值传递给新的对象,将值拷贝一份,这样就有两份值,分别指向拷贝前后的对象,无论拷贝之后的值如何修改,都不会改被拷贝对象的值。在此与深拷贝相同。
而引用调用是将原来对象的值不变,将值的地址拷贝一份传给新的对象。这样新的对象也可以调用值,但是如果做出修改,原对象的值也会发生改变。因为两个对象的值存放地址是同一个。
在函数调用中,值调用方式将实参的值传给形参,下面所定义的函数foo为值调用方式,函数g的第一个参数采用值调用,第二个参数采用引用调用方式传递数据。若有表达式y=foo(2),则foo调用执行之后,y被赋值为 7。
foo(int x)
int b = x - 1;
g(x,b);
return b + x;
g(int b, int &x)
b = b + 1;
x = 2 * b - x;
return;
因为第二个函数是引用调用,所以返回的值将foo()函数中的值也改变了。