tags:

views:

706

answers:

4

Possible Duplicate:
What is the difference between a deep copy and a shallow copy?

What is the difference between deep and shallow copy. What type of a copy does a copy constructor do?

+2  A: 

The quintessential example of this is an array of pointers to structs or objects (that are mutable).

A shallow copy copies the array and maintains references to the original objects.

A deep copy will copy (clone) the objects too so they bear no relation to the original. Implicit in this is that the object themselves are deep copied. This is where it gets hard because there's no real way to know if something was deep copied or not.

The default copy constructor is shallow. You can make your own copy constructors deep or shallow, as appropriate. See C++ Notes: OOP: Copy Constructors.

cletus
It should be *an array of **pointers to** mutable objects*
David Rodríguez - dribeas
+1  A: 

Shallow copy:

Some members of the copy may reference the same objects as the original:

class X
{
private:
    int i;
    int *pi;
public:
    X()
        : pi(new int)
    { }
    X(const X& copy)   // <-- copy ctor
        : i(copy.i), pi(copy.pi)
    { }
};

Here, the pi member of the original and copied X object will both point to the same int.


Deep copy:

All members of the original are cloned. There are no shared objects:

class X
{
private:
    int i;
    int *pi;
public:
    X()
        : pi(new int)
    { }
    X(const X& copy)   // <-- copy ctor
        : i(copy.i), pi(new int(*copy.pi))  // <-- note this line in particular!
    { }
};

Here, the pi member of the original and copied X object will point to different int objects, but both of these have the same value.


The default copy constructor (which is automatically provided if you don't provide one yourself) creates only shallow copies.


P.S.: Just for reference: While it may read a little cryptic, here's what section 12.8, paragraph 8 of the 1998 C++ standard says about the above code examples:

The implicitly defined copy constructor for class X performs a memberwise copy of its subobjects. [...] Each subobject is copied in the manner appropriate to its type: [...] [I]f the subobject is of scalar type, the builtin assignment operator is used.

stakx
The cryptic paragraph seems to disagree with your bold claim that default copy constructor only makes shallow copies.
UncleBens
What makes you think so? I understand this as follows: Members of some pointer type are a scalar subobject, aren't they? And if you copy a pointer using the inbuilt assignment operator, that means that the pointed-to object won't be cloned, but simply be referred to by an additional pointer. Therefore you end up with a shallow copy.
stakx
@stakx You are right, but I think this illustrates that the terms "deep copy" and "shallow copy" are not particularly useful - in fact I've never heard them used by experienced C++ programmers.
anon
The default copy constructor makes a *member-wise* copy, and whether a deep or shallow copy is made of a member depends entirely on the behavior of members. `struct Person { string firstName, lastName; }` - the default copy constructor makes a *deep* copy.
UncleBens
@UncleBens: No it doesn't. Not if one of the members is a pointer or reference type. So as @Neil said, the terms just aren't useful in C++. Even in fairly simple cases, the default copy constructor will do some in-between thing, as will many user-defined copy constructors.
jalf
The set of all possible Copy contructor "types" does not include the disjoint set of JUST "shallow" and "deep". It includes everything in-between (e.g. half the members may be shallow copied, half may be deep copied - yet you'll never know if THOSE members are doing a shallow or deep copy unless you know THEIR implementations). The default copy constructor is neither always "shallow" nor always "deep". The terms shallow and deep just describe possible behaviors.
franji1
+1  A: 

Deep copy literally performs a deep copy. It means, that if your class has some fields that are references, their values will be copied, not references themselves. If, for example you have two instances of a class, A & B with fields of reference type, and perform a deep copy, changing a value of that field in A won't affect a value in B. And vise-versa. Things are different with shallow copy, because only references are copied, therefore, changing this field in a copied object would affect the original object.

What type of a copy does a copy constructor does?

It is implementation - dependent. This means that there are no strict rules about that, you can implement it like a deep copy or shallow copy, however as far as i know it is a common practice to implement a deep copy in a copy constructor. A default copy constructor performs a shallow copy though.

n535
A: 

Hello all, Please go through this link for shallow vs deep copy.It's a very good link http://www.fredosaurus.com/notes-cpp/oop-condestructors/shallowdeepcopy.html

rama