22 - Constructor de la clase


En C++ podemos definir un método que se ejecute inicialmente y en forma automática. Este método se lo llama constructor.

El constructor tiene las siguientes características:

Problema 1:

Se desea guardar los sueldos de 5 operarios en un vector. Realizar la carga del vector en el constructor.

Programa:

#include<iostream>

using namespace std;

class Operarios {
private:
    float sueldos[5];
public:
    Operarios();
    void imprimir();
};

Operarios::Operarios()
{
    cout <<"Carga de sueldos." <<"\n";
    for(int f=0;f < 5;f++)
    {
        cout <<"Ingrese el sueldo:";
        cin >>sueldos[f];
    }
}

void Operarios::imprimir()
{
    for(int f = 0; f < 5; f++)
    {
        cout <<sueldos[f] <<"\n";;
    }
    cin.get();
    cin.get();
}

int main()
{
    Operarios op;
    op.imprimir();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : Constructor1.zip

Como podemos ver es el mismo problema que resolvimos cuando vimos vectores. La diferencia es que hemos sustituido el método cargar con el constructor:

Operarios::Operarios()
{
    cout <<"Carga de sueldos." <<"\n";
    for(int f=0;f < 5;f++)
    {
        cout <<"Ingrese el sueldo:";
        cin >>sueldos[f];
    }
}

Como la clase se llama Operarios el constructor tiene el mismo nombre, no disponemos la palabra clave void ya que el constructor no puede retornar datos.

La ventaja de plantear un constructor en lugar de definir un método con cualquier nombre es que se llamará en forma automática cuando se defina un objeto de esta clase:

    Operarios op;   //se esta llamando al constructor en esta línea

Cuando se crea el objeto op se llama al método constructor.

Finalmente llamamos al método imprimir con la sintaxis que ya conocemos:

    op.imprimir();

Problema 2:

Plantear una clase llamada Alumno y definir como atributos su nombre y su edad. En el constructor realizar la carga de datos. Definir otros dos métodos para imprimir los datos ingresados y un mensaje si es mayor o no de edad (edad >=18)

Programa:

#include<iostream>

using namespace std;

class Alumno {
private:
    char nombre[40];
    int edad;
public:
    Alumno();
    void imprimir();
    void esMayorEdad();
};

Alumno::Alumno()
{
    cout <<"Ingrese nombre:";
    cin.getline(nombre,40);
    cout <<"Ingrese la edad:";
    cin >>edad;
}

void Alumno::imprimir()
{
    cout <<"Nombre:" <<nombre <<"\n";
    cout <<"Edad:" <<edad <<"\n";
}

void Alumno::esMayorEdad()
{
    if (edad >= 18) 
    {
        cout <<"es mayor de edad.";
    }
    else 
    {
        cout <<"no es mayor de edad.";
    }
    cin.get();
    cin.get();
}

int main()
{
    Alumno alumno1;
    alumno1.imprimir();
    alumno1.esMayorEdad();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : Constructor2.zip

Declaramos la clase Alumno, sus dos atributos y definimos el constructor con el mismo nombre de la clase:

class Alumno {
private:
    char nombre[40];
    int edad;
public:
    Alumno();
    void imprimir();
    void esMayorEdad();
};

En el constructor realizamos la carga de los dos atributos por teclado:

Alumno::Alumno()
{
    cout <<"Ingrese nombre:";
    cin.getline(nombre,40);
    cout <<"Ingrese la edad:";
    cin >>edad;
}

En la main el constructor se llama en forma automática cuando definimos un objeto de la clase Alumno:

int main()
{
    Alumno alumno1;

Los otros dos métodos deben llamarse por su nombre y en el orden que necesitemos:

    alumno1.imprimir();
    alumno1.esMayorEdad();

Problema 3:

Plantear una clase llamada Moneda. Al constructor llega como parámetro el valor de la moneda (1,5,50 o 100) Definir luego dos objetos de esta clase con valores de moneda 5 y 50.

Programa:

#include<iostream>

using namespace std;

class Moneda {
private:
    int valor;
public:
    Moneda(int v);
    void imprimir();
};

Moneda::Moneda(int v)
{
    valor=v;
}

void Moneda::imprimir()
{
    cout <<"Valor de la moneda:" <<valor <<"\n";
}

int main()
{
    Moneda moneda1(5);
    Moneda moneda2(50);
    moneda1.imprimir();
    moneda2.imprimir();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : Constructor3.zip

Como hemos dicho un constructor no puede retornar dato, pero si puede recibir uno o más parámetros, en este caso el constructor recibe un entero (hay un atributo llamado valor que se inicializa en el constructor con el parámetro v):

class Moneda {
private:
    int valor;
public:
    Moneda(int v);
    void imprimir();
};

Moneda::Moneda(int v)
{
    valor=v;
}

Ahora cuando definimos un objeto de la clase Moneda debemos pasar un parámetro entero en el momento de definir el objeto:

    Moneda moneda1(5);

Como este problema requiere definir dos objetos de la clase moneda la función main completa es:

int main()
{
    Moneda moneda1(5);
    Moneda moneda2(50);
    moneda1.imprimir();
    moneda2.imprimir();
    return 0;
}

Si el constructor tiene un solo parámetro podemos utilizar la siguiente sintaxis alternativa para definir el objeto y que se llame el constructor:

	Moneda moneda1=5;

Problemas propuestos

  1. Confeccionar una clase que represente un empleado. Definir como atributos su nombre y su sueldo. En el constructor cargar los atributos y luego en otro método imprimir sus datos y por último uno que imprima un mensaje si debe pagar impuestos (si el sueldo supera a 3000)
  2. Implementar la clase Operaciones. Al constructor llegan dos enteros que deben utilizarse en los métodos para calcular su suma, resta, multiplicación y división. imprimir dichos resultados.
Solución
#include<iostream>

using namespace std;

class EmpleadoFabrica {
private:
    char nombre[40];
    float sueldo;
public:
    EmpleadoFabrica();
    void imprimir();
    void pagaImpuestos();
};

EmpleadoFabrica::EmpleadoFabrica()
{
    cout <<"Ingrese el nombre del empleado:";
    cin.getline(nombre,40);
    cout <<"Ingrese su sueldo:";
    cin >>sueldo;
}

void EmpleadoFabrica::imprimir()
{
    cout <<"Nombre:" <<nombre <<"\n";
    cout <<"Sueldo:"  <<sueldo <<"\n\n";
}

void EmpleadoFabrica::pagaImpuestos() 
{
    if (sueldo > 3000)
    {
        cout <<"Debe abonar impuestos";
    }
    else 
    {
        cout <<"No paga impuestos";
    }
    cin.get();
    cin.get();
}
    
int main()
{
    EmpleadoFabrica empleado1;
    empleado1.imprimir();
    empleado1.pagaImpuestos();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace :Constructor4.zip

#include<iostream> using namespace std; class Operaciones { private: int valor1,valor2; public: Operaciones(int v1,int v2); void sumar(); void restar(); void multiplicar(); void dividir(); }; Operaciones::Operaciones(int v1,int v2) { valor1=v1; valor2=v2; } void Operaciones::sumar() { int suma; suma=valor1+valor2; cout <<"La suma es:" <<suma <<"\n"; } void Operaciones::restar() { int resta; resta=valor1-valor2; cout <<"La resta es:" <<resta <<"\n"; } void Operaciones::multiplicar() { int multi; multi=valor1*valor2; cout <<"El producto es:" <<multi <<"\n"; } void Operaciones::dividir() { int division; division=valor1/valor2; cout <<"La division es:" <<division <<"\n"; } int main() { Operaciones operaciones1(100,50); operaciones1.sumar(); operaciones1.restar(); operaciones1.multiplicar(); operaciones1.dividir(); return 0; }

Este proyecto lo puede descargar en un zip desde este enlace :Constructor5.zip

Retornar