El constructor de clase no es mas que una función miembro de clase, que tiene el mismo nombre que la clase.
El constructor de clase debe de ser de tipo void, no retorna ningún valor.
Toda clase debe tener un constructor, si el programador no la incluye, el compilador crea un constructor nulo.
Puede haber más de un constructor en una misma clase. Cuando esto sucede, la lista de parámetros debe de ser diferente entre los constructores.
Los constructores se suelen utilizar para inicializar los atributos de la clase.
Ejem.-
Vamos a utilizar la clase Punto ya vista, pero con el añadido del constructor de clase
class Punto
{
private: //Miembros privados de la clase
int _x;
int _y;
public: //Miembros públicos de la clase
Punto(int x, int y); //Constructor de clase
Punto (); //Constructor de clase
void SetX(const int valor);
void SetY(const int valor);
int GetX(void);
int GetY(void);
};
.
.
.
//Constructor de clase
Punto::Punto(int x, int y)
{
_x = x;
_y = y;
}
Punto::Punto()
{
_x = 0;
_y = 0;
}
Punto::Punto()
{
_x = 0;
_y = 0;
}
. . .
int main(void)
{
//. . .
Punto Pinicio(10,0); // Crea un objeto de la clase Punto llamado Pinicio y le pasa
// los parámetros adecuados
Punto Pbase; // Crea un objeto de la clase Punto llamado Pbase sin parámetros
int main(void)
{
//. . .
Punto Pinicio(10,0); // Crea un objeto de la clase Punto llamado Pinicio y le pasa
// los parámetros adecuados
Punto Pbase; // Crea un objeto de la clase Punto llamado Pbase sin parámetros
//. . .
}
Si se declara un constructor sin parámetros, al declarar un objeto de dicha clase, se debe llamar al constructor sin parámetros, y sin los paréntesis.
Para el constructor Punto también se puede utilizar esta otra nomenclatura :
Punto::Punto(int x, int y):_x(x), _y(y) {}
Punto::Punto() : _x(0), _y(0) {}
También podemos declarar un constructor con argumentos por defecto, se podría haber creado un único constructor para la clase Punto con argumentos por defecto con valor 0 de esta manera:
...
//dentro del cuerpo de la definición de clase
Punto(int x = 0, int y =0): _x(x), _y(y) {}
...
Constructor de copia. Es un tipo de constructor especial que recibe como único parámetro una referencia a un objeto de la misma clase.
Reescribiendo nuestra clase Punto con un constructor de copia quedaría así:
class Punto
{
private: //Miembros privados de la clase
int _x;
int _y;
public: //Miembros públicos de la clase
Punto(int x = 0, int y = 0):_x(x), _y(y) {} //Constructor de clase con parámetros
//por defecto
Punto (Punto &Obj); //Constructor de copia//por defecto
void SetX(const int valor);
void SetY(const int valor);
int GetX(void);
int GetY(void);
};
Punto::Punto(Punto &Obj):_x(Obj._x), _y(Obj._y) {}
. . .
. . .
Punto Punto1(20,56);
Punto Punto2(Punto1); //Uso del constructor de copia.
Los valores de _x e _y de Punto2 serían 20 y 56, respectivamente, ha copiado los valores de Punto1.