Copy Constructor - Definition

Definition

Copying of objects is achieved by the use of a copy constructor and an assignment operator. A copy constructor has as its first parameter a (possibly const or volatile) reference to its own class type. It can have more arguments, but the rest must have default values associated with them. The following would be valid copy constructors for class X:

X(const X& copy_from_me); X( X& copy_from_me); X( volatile X& copy_from_me); X(const volatile X& copy_from_me); X( X& copy_from_me, int = 0); X(const X& copy_from_me, double = 1.0, int = 42); ...

The first one should be used unless there is a good reason to use one of the others. One of the differences between the first and the second is that temporaries can be copied with the first. For example:

X a = X; // valid given X(const X& copy_from_me) but not valid given X(X& copy_from_me) // because the second wants a non-const X& // to create a, the compiler first creates a temporary by invoking the default constructor // of X, then uses the copy constructor to initialize as a copy of that temporary. // For some compilers both versions actually work but this behaviour should not be relied // upon because it's non-standard.

Another difference between them is the obvious:

const X a; X b = a; // valid given X(const X& copy_from_me) but not valid given X(X& copy_from_me) // because the second wants a non-const X&

The X& form of the copy constructor is used when it is necessary to modify the copied object. This is very rare but it can be seen used in the standard library's std::auto_ptr. A reference must be provided:

X a; X b = a; // valid if any of the copy constructors are defined // since a reference is being passed.

The following are invalid copy constructors (Reason - copy_from_me is not passed as reference) :

X(X copy_from_me); X(const X copy_from_me);

because the call to those constructors would require a copy as well, which would result in an infinitely recursive call.

The following cases may result in a call to a copy constructor:

  1. When an object is returned by value
  2. When an object is passed (to a function) by value as an argument
  3. When an object is thrown
  4. When an object is caught
  5. When an object is placed in a brace-enclosed initializer list

These cases are collectively called copy-initialization and are equivalent to: T x = a;

It is however, not guaranteed that a copy constructor will be called in these cases, because the C++ Standard allows the compiler to optimize the copy away in certain cases, one example being the return value optimization (sometimes referred to as RVO).

Read more about this topic:  Copy Constructor

Famous quotes containing the word definition:

    According to our social pyramid, all men who feel displaced racially, culturally, and/or because of economic hardships will turn on those whom they feel they can order and humiliate, usually women, children, and animals—just as they have been ordered and humiliated by those privileged few who are in power. However, this definition does not explain why there are privileged men who behave this way toward women.
    Ana Castillo (b. 1953)

    Beauty, like all other qualities presented to human experience, is relative; and the definition of it becomes unmeaning and useless in proportion to its abstractness. To define beauty not in the most abstract, but in the most concrete terms possible, not to find a universal formula for it, but the formula which expresses most adequately this or that special manifestation of it, is the aim of the true student of aesthetics.
    Walter Pater (1839–1894)

    No man, not even a doctor, ever gives any other definition of what a nurse should be than this—”devoted and obedient.” This definition would do just as well for a porter. It might even do for a horse. It would not do for a policeman.
    Florence Nightingale (1820–1910)