Copy Constructor


Copy Constructor

As you may remember, a class may have several constructors. One of the most important constructors is the copy constructors. The copy constructor is, as its name indicates, as constructor that creates an exact copy of another object; it can be said that the copy constructor creates a clone of another object. For instance, suppose you have a function that takes one single parameter of the Book class, in this case before the function begins its execution, the copy constructor of the Book class will be called to create an exact copy of the book as shown below.
Como usted se puede acordar, una clase puede tener varios constructores. Uno de los constructores más importantes es el constructor de copia. El constructor de copia es, como su nombre lo indica, un constructor que crea una copia exacta de otro objeto; se puede decir que el constructor de copia crea un clon de otro objeto. Por ejemplo, suponga que se tiene una función que toma un sólo parámetro de la clase Book, en este caso antes de que la función comience su ejecución, el constructor de copia de la clase Book será llamado para crear una copia exacta del libro como se muestra debajo.

CopyConstructor

Tip
In the previous code, the Prepare function takes a Box object. When the function is being called, the copy constructor is called to create an exact copy of the original box. The copy constructor receives a reference to the original box; in this case, this reference is called "init". The copy constructor, then, executes the same commands as the default constructor, but instead of setting the dimensions of the box to zero, the copy constructor sets the dimensions to the values of the original box. When the Prepare function is called, first another function called Copy Constructor is executed; second the code of the Prepare function is executed. As the copy constructor is automatically called, beginner programmer they do not know what the copy constructor is neither what it does.
En el código previo, la función Prepare toma un objeto Box. Cuando la función es llamada, el constructor de copia es llamado para crear una copia exacta de la caja original. El constructor de copia recibe una referencia a la caja original; en este caso, esta referencia se llama "init". El constructor de copia, entonces, ejecuta los mismos comandos que el constructor principal, pero en lugar de fijar las dimensiones de la caja a cero, el constructor de copia fija las dimensiones de los valores que tiene la caja original. Cuando se manda llamar la función Prepare, primero otra función llamada constructor de copia se ejecuta , y después se ejecuta el código de la función Prepare. Como el constructor de copia se manda llamar automáticamente, los programadores inexpertos no saben que es o para que sirve el constructor de copia.

Tip
If the programmer does not provide a Copy Constructor, the compiler will provide one. However, if your class uses the operator new, the Copy Constructor provided by the compiler will not work. The Copy Constructor is one of the basic elements that declare a class as a compatible with the Standard Template Library (STL). A bad programmer does not know what the purpose of the copy constructor is. In next example, the copy constructor is not being called when Display is called because the object is passed by reference, however, if the Display2 function is called then the copy constructor will be called.
Si el programador no proporciona un Constructor de Copia, el compilador proporcionará uno. Sin embargo, si su clase usa el operador new, el Constructor de Copia proporcionado por el compilador no funcionará. El Constructor de Copia es uno de los elementos básicos que declara a una clase como compatible con la Librería de Plantillas Estándar (STL). Un mal programador no sabe cuál es el propósito del constructor de copia. En el siguiente ejemplo, el constructor de copia no se manda llamar cuando se ejecuta Display porque el objeto se pasa por referencia, sin embargo, si se ejecuta la función Display2 entonces el constructor de copia se mandará llamar.

Space.cpp
void Space::Window_Open(Win::Event& e)
{
     MyArray x(2);
     x.data[0] = 10.0;
     x.data[1] = 11.0;
     Display(x); // void Display(MyArray& array) This function DOES NOT call the copy constructor
     Display2(x); // void Display2(MyArray array) This funcion CALLS the copy constructor, array is a copy of x
}


Tip
In the previous code, the Prepare function takes a Box object. Note that if the function would take a pointer or a reference to the object, the Copy Constructor would not be called.
En el código previo, la función Prepare toma un objeto Box. Observe que si la función tomara un puntero o una referencia al objeto, el Constructor de Copia no sería llamado.

Tip
The copy constructor is called each time that any function (member of the class, of other class, or global function) that takes as parameter an object of the class is called, see codes below.
El constructor de copia se llama en cada momento que cualquier función (de la clase, de otra clase o una función global) que toma como parámetro un objeto de la clase es llamada, vea los códigos de abajo.

Program.cpp
void Program::Window_Open(Win::Event& e)
{
     MyArray x;
     Display2(x); // It calls the copy constructor
}

void Program::Display2(MyArray array)
{
     ...
}


Program.cpp
void Program::Window_Open(Win::Event& e)
{
     MyArray x(2);
     x.data[0] = 10;
     x.data[1] = 20.5;

     MyArray y(x); // It calls the copy constructor
}


Tip
The copy constructor has two steps:
  1. Perform the actions of the default constructor
  2. Copy the object from init to this

El constructor de copia tiene dos pasos:
  1. Realizar las acciones del constructor de defecto
  2. Copiar el objeto desde init a this

Problem 1
Does the Box class need a copy constructor?
Necesita la clase Box un constructor de copia?

Problem 2
Does the Book class (from the Library program) need a copy constructor?
Necesita la clase Book (del programa Library) un constructor de copia?

Problem 3
Does the ComplexNumb class (from the Space program) need a copy constructor?
Necesita la clase ComplexNumb (del programa Space) un constructor de copia?

Problem 4
Does the RandomDay class (from the Space program) need a copy constructor?
Necesita la clase RandomDay (del programa Space) un constructor de copia?

Problem 5
Does the MyArray class (from the Space program) need a copy constructor?
Necesita la clase MyArray (del programa Space) un constructor de copia?

Problem 6
Does the MyPoint class (from the Space program) need a copy constructor?
Necesita la clase MyPoint (del programa Space) un constructor de copia?

Problem 7
Does the MyText class (from the Space program) need a copy constructor?
Necesita la clase MyText (del programa Space) un constructor de copia?

Problem 8
(a) Describe what happens when a function that takes one object of the MyPoint class is called? (b) Describe what happens when a function that takes one object of the MyArray class is called?
(a) Describa que pasa cuando una función que toma un objeto de la clase MyPoint es llamada? (b) Describa que pasa cuando una función que toma un objeto de la clase MyArray es llamada?

Problem 9
Modify the MyText class by providing a copy constructor. You must perform the tasks of the default constructor in the copy constructor, and the new object (created by the copy constructor) must be an exact copy of the original object. Use the Debugger to test your class; before executing the Function that takes the object, press F11 so that the Debugger enters into the copy constructor.
Modifique la clase MyText proporcionando un constructor de copia. Usted debe realizar todas las tareas que hace el constructor de defecto, y el nuevo objeto (creado por el constructor de copia) debe ser una copia exacta del objeto original. Use el Depurador para probar su clase; antes de ejecutar la función que toma el objeto, presione F11 para que el Depurador entre en el constructor de copia.

MyText.h
#pragma once
class MyText
{
public:
     MyText(void);
     MyText(const wchar_t* text);
     MyText(const MyText& init); //Copy Constructor
     ~MyText(void);
     wchar_t* Get();
     void Set(const wchar_t* text);
     void MakeUpperCase();
     void MakeLowerCase();
     int ReplaceChar(wchar_t original_character, wchar_t new_character);
     int CountChar(wchar_t character);
     bool DeleteAt(int position);
     bool InsertAt(int position, wchar_t character);
     int DeleteChar(wchar_t character);
private:
     wchar_t* data;
};

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     MyText tx(L"Hello Friend!");
     Display(tx);
}

void Space::Display(MyText a)
{
     this->Text = a.Get();
}

MyTextCopyConstructor1

MyTextCopyConstructor2

MyTextCopyConstructor3

MyTextCopyConstructor4

MyTextCopyConstructor5

Problem 10
Modify the MyArray class by providing a copy constructor. You must perform the tasks of the default constructor in the copy constructor, and the new object (created by the copy constructor) must be an exact copy of the original object. Use the Debugger to test your class; before executing the Function that takes the object, press F11 so that the Debugger enters into the copy constructor. You may use the Watch Window as shown below to watch the values of z.
Modifique la clase MyArray proporcionando un constructor de copia. Usted debe realizar todas las tareas que hace el constructor de defecto, y el nuevo objeto (creado por el constructor de copia) debe ser una copia exacta del objeto original. Use el Depurador para probar su clase; antes de ejecutar la función que toma el objeto, presione F11 para que el Depurador entre en el constructor de copia. Usted puede usar la Ventana de Watch como se muestra debajo para ver los valores de z.

MyArray.h
#pragma once
class MyArray
{
public:
     MyArray(void);
     MyArray(int count);
     MyArray(const MyArray& init); //Copy Constructor
     ~MyArray(void);
     int GetCount();
     bool Resize(int newSize);
     double *data;
     int CountEqual(double value);
     bool InserAt(int position, double value);
     bool DeleteAt(int position);
private:
     int count;
};

Space.cpp
...

void Space::Window_Open(Win::Event& e)
{
     MyArray z(10);
     for(int i = 0; i < 10; i++) z.data[i] = 2.0*i;
     Display(z);
}

void Space::Display(MyArray w)
{
     const int count = w.GetCount();
     wstring text;
     for(int i = 0; i < count ; i++)
     {
          Sys::Format(text, L"x[%d] = %g\r\n", i, w.data[i]);
          tbxOutput.Text += text;
     }
}

MyArrayCopyConstructor1

MyArrayCopyConstructor2

MyArrayCopyConstructor3

MyArrayCopyConstructor4

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home