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!!