Clases en C++

Saludos a todas las personas que visitan este blog!!
En los anteriores posts hemos visto sobre cómo compilar un archivo C++, también sobre el uso de Headers y Structs en C++ - aquí hablamos de manera superficial sobre las funciones y cómo un header nos puede ayudar a solucionar las llamadas a una función - y también tocamos un poco el tema de los punteros en C++. El día de hoy vamos a conocer un poco sobre clases en C++, pero antes vamos a hecharle un vistazo rápido a lo que es la programación orientada a objetos OOP (Object Oriented Programming), qué és una clase? como crear clases en C++, el constructor de una clase, su destructor y como instanciarlas. Pues bien, sin dar largas al preámbulo comenzemos.

Programación Orientada a Objetos

La programación orientada a objetos es un paradigma de programación que nos permite expresar la realidad en la que vivimos de una forma un tanto mas acertada. Pero de que vá este paradigma de programación?

Pues bien, vamos a pensar en un objeto real como por ejemplo una lámpara, esta lámpara tiene propiedades como color, tamaño, tipo, etc y puede realizar acciones como encender o apagar

Lámpara:
    - Propiedades:
        - Color -> Negro
        - Tamano -> Mediana
        - Tipo -> Lámpara de Mesa de Noche
    - Acciones:
        - Encender -> Sí/No

Clases

Una clase es la representación de un objeto que puede tener atributos y métodos que a su vez pueden ser públicos, protegidos o privados.

Modificadores de acceso

  • Público -> Cualquiera puede acceder
  • Privado -> Solo puede ser accedido por los propios miembros de la clase (No se puede acceder desde el exterior)
  • Protegido -> Puede ser accedido únicamente por las clases derivadas

El modificador de acceso protegido lo explicaré en otro post.

Clase en C++

class Person { // Sólo la declaración de la clase
private: // Variables y/ funciones privadas
    char *name, *lastName;
    int age;

public: // Variables y/ funciones públicas
    void printPersonInfo();

    void setName(char* personName) {
        name = personName;

    }

    void setLastName(char* personLastName) {
        lastName = personLastName;
    }

    void setAge(int personAge) {
        age = personAge;
    }
};

int main() {

    Person person; // Creamos una nueva instancia del tipo "Persona"

    char personName[50] = "John";
    char personLastName[50] = "Doe";

    // Usamos las funciones publicas para poder dar valor a las variables privadas
    person.setName(personName);
    person.setLastName(personLastName);
    person.setAge(31);
    person.printPersonInfo();

    return 0;
}

Los mas observadores se habrán dado cuenta que la función printPersonInfo no tiene ningún código, solamente está declarada, pero por qué?

Bueno, la respuesta a esa pregunta es que no es necesario desarrollar el codigo de una función dentro de la clase, podemos hacerlo afuera sin ningún problema, lo cual haremos de la siguiente manera:

void Person::printPersonInfo() {
    cout << "Name is: " << name << endl;
    cout << "Last Name is: " << lastName << endl;
    cout << "Age is: " << age << endl;
}

Como se habrán dado cuenta el código contiene Person::printPersonInfo, los doble dos puntos permiten acceder a la funcion declarada desde afuera del ámbito de la clase

Constructor y Destructor

Otra forma de inciar nuestra nueva clase es con un Constructor, el cual es un tipo especial de función que lleva el mismo nombre que la clase y que no retornan ningún valor. En el siguiente ejemplo vamos a ver cómo se utiliza un constructor en una clase.

Constructor

class Person { // Sólo la declaración de la clase
public: 
    // Constructor
   Person(char *personName, char *personLastName) {
        name = personName;
        lastName = personLastName;
        cout << "Constructor is called!!" << endl;
    }

private: // Variables y/ funciones privadas
    char *name, *lastName;
    int age;

public: // Variables y/ funciones públicas
    void printPersonInfo();

    void setAge(int personAge) {
        age = personAge;
    }
};

int main() {

    char personName[50] = "John";
    char personLastName[50] = "Doe";

    /**
    * Nueva instancia de Person utilizando su constructor
    * Esto nos permite dar valor a las variables de nombre y apellido
    * al momento de iniciar la clase
    */
    Person *person = new Person(personName, personLastName);

   // El operador -> se utiliza cuando nuestra clase también es de tipo Puntero
    person -> setAge(31);
    person -> printPersonInfo();
}

Pueden haber varios constructores para la misma clase, los cuales reciben diferentes parámetros, a esto se le llama sobrecarga de constructor.

Destructor

Bien ahora que estamos llegando al final del post, es necesario hablar sobre un tema muy importante en el mundo del lenguaje C/C++.

C++ no posee un recolector de basura como lo tienen otros lenguajes tales como Java, Kotlin, Python, Rust, etc. Al no poseer un recolector de basura es necesario que el programador sepa cuándo debe eliminar un objeto de la memoria para así liberarla y evitar que nuestro computador "colapse" por que se ha quedado sin espacio en la misma.

Dicho esto en C++ una de las formas de liberar la memoria es tener un destructor en nuestra clase. El cual debe tener las siguientes características:

  • Tiene el mismo nombre que la clase
  • No recibe parametros
  • El nombre del destructor comienza siempre con ~
  • No puede haber más de un destructor por clase
class Person {
public: 
    // Constructor
    Person(char *personName, char *personLastName) {
        name = personName;
        lastName = personLastName;
        cout << "Constructor is called!!" << endl;
    }
    // Destructor
    ~Person() {
        cout << "Destructor is called!!" << endl;
    }
};

int main() {
    char personName[50] = "John";
    char personLastName[50] = "Doe";

    Person *person = new Person(personName, personLastName);

    // Llamada al destructor para que este elimine dicho objeto y libere memoria
    delete person;
}

Si deseas ver el código completo sobre Clases en C++ lo puedes hacer desde la siguiente dirección:
https://github.com/nano-bytes/cpp-compilation

Happy Hacking!!

You may also like...