En este tema, aprenderemos sobre dos conceptos fundamentales en la Programación Orientada a Objetos (POO) en C++: los constructores y los destructores. Estos son métodos especiales que se utilizan para inicializar y limpiar objetos, respectivamente.
- Constructores
¿Qué es un Constructor?
Un constructor es una función miembro especial de una clase que se llama automáticamente cuando se crea un objeto de esa clase. Su principal función es inicializar los miembros de datos del objeto.
Características de los Constructores:
- Nombre del Constructor: El constructor tiene el mismo nombre que la clase.
- No tiene tipo de retorno: No devuelve ningún valor, ni siquiera
void
. - Llamada Automática: Se llama automáticamente cuando se crea un objeto.
- Sobrecarga: Puede haber más de un constructor en una clase (sobrecarga de constructores).
Tipos de Constructores:
- Constructor por Defecto: No toma ningún argumento.
- Constructor Parametrizado: Toma uno o más argumentos.
- Constructor de Copia: Inicializa un objeto usando otro objeto de la misma clase.
Ejemplo de Constructores:
#include <iostream> using namespace std; class Punto { private: int x, y; public: // Constructor por defecto Punto() { x = 0; y = 0; } // Constructor parametrizado Punto(int xVal, int yVal) { x = xVal; y = yVal; } // Constructor de copia Punto(const Punto &p) { x = p.x; y = p.y; } void mostrar() { cout << "Punto(" << x << ", " << y << ")" << endl; } }; int main() { Punto p1; // Llama al constructor por defecto Punto p2(5, 10); // Llama al constructor parametrizado Punto p3 = p2; // Llama al constructor de copia p1.mostrar(); p2.mostrar(); p3.mostrar(); return 0; }
Explicación del Código:
- Constructor por Defecto:
Punto() { x = 0; y = 0; }
inicializax
yy
a 0. - Constructor Parametrizado:
Punto(int xVal, int yVal) { x = xVal; y = yVal; }
inicializax
yy
con los valores proporcionados. - Constructor de Copia:
Punto(const Punto &p) { x = p.x; y = p.y; }
inicializax
yy
con los valores de otro objetop
.
- Destructores
¿Qué es un Destructor?
Un destructor es una función miembro especial de una clase que se llama automáticamente cuando un objeto de esa clase se destruye. Su principal función es liberar recursos que el objeto pudo haber adquirido durante su vida.
Características de los Destructores:
- Nombre del Destructor: El destructor tiene el mismo nombre que la clase, pero precedido por una tilde (
~
). - No tiene tipo de retorno: No devuelve ningún valor, ni siquiera
void
. - No toma argumentos: No puede ser sobrecargado.
- Llamada Automática: Se llama automáticamente cuando el objeto sale del ámbito o se elimina.
Ejemplo de Destructores:
#include <iostream> using namespace std; class Punto { private: int x, y; public: // Constructor por defecto Punto() { x = 0; y = 0; cout << "Constructor por defecto llamado" << endl; } // Constructor parametrizado Punto(int xVal, int yVal) { x = xVal; y = yVal; cout << "Constructor parametrizado llamado" << endl; } // Destructor ~Punto() { cout << "Destructor llamado para Punto(" << x << ", " << y << ")" << endl; } void mostrar() { cout << "Punto(" << x << ", " << y << ")" << endl; } }; int main() { Punto p1; // Llama al constructor por defecto Punto p2(5, 10); // Llama al constructor parametrizado p1.mostrar(); p2.mostrar(); return 0; }
Explicación del Código:
- Destructor:
~Punto() { cout << "Destructor llamado para Punto(" << x << ", " << y << ")" << endl; }
imprime un mensaje cuando el objeto se destruye.
Ejercicios Prácticos
Ejercicio 1: Constructor y Destructor Básico
Instrucciones:
- Crea una clase
Rectangulo
con dos miembros de datosancho
yalto
. - Implementa un constructor por defecto que inicialice
ancho
yalto
a 1. - Implementa un constructor parametrizado que inicialice
ancho
yalto
con valores proporcionados. - Implementa un destructor que imprima un mensaje cuando se llame.
- Crea objetos de
Rectangulo
enmain
y muestra sus valores.
Solución:
#include <iostream> using namespace std; class Rectangulo { private: int ancho, alto; public: // Constructor por defecto Rectangulo() { ancho = 1; alto = 1; cout << "Constructor por defecto llamado" << endl; } // Constructor parametrizado Rectangulo(int a, int h) { ancho = a; alto = h; cout << "Constructor parametrizado llamado" << endl; } // Destructor ~Rectangulo() { cout << "Destructor llamado para Rectangulo(" << ancho << ", " << alto << ")" << endl; } void mostrar() { cout << "Rectangulo(" << ancho << ", " << alto << ")" << endl; } }; int main() { Rectangulo r1; // Llama al constructor por defecto Rectangulo r2(4, 5); // Llama al constructor parametrizado r1.mostrar(); r2.mostrar(); return 0; }
Ejercicio 2: Constructor de Copia
Instrucciones:
- Añade un constructor de copia a la clase
Rectangulo
. - Crea un objeto
Rectangulo
usando otro objeto existente. - Muestra los valores del nuevo objeto para verificar que se ha copiado correctamente.
Solución:
#include <iostream> using namespace std; class Rectangulo { private: int ancho, alto; public: // Constructor por defecto Rectangulo() { ancho = 1; alto = 1; cout << "Constructor por defecto llamado" << endl; } // Constructor parametrizado Rectangulo(int a, int h) { ancho = a; alto = h; cout << "Constructor parametrizado llamado" << endl; } // Constructor de copia Rectangulo(const Rectangulo &r) { ancho = r.ancho; alto = r.alto; cout << "Constructor de copia llamado" << endl; } // Destructor ~Rectangulo() { cout << "Destructor llamado para Rectangulo(" << ancho << ", " << alto << ")" << endl; } void mostrar() { cout << "Rectangulo(" << ancho << ", " << alto << ")" << endl; } }; int main() { Rectangulo r1(4, 5); // Llama al constructor parametrizado Rectangulo r2 = r1; // Llama al constructor de copia r1.mostrar(); r2.mostrar(); return 0; }
Conclusión
En esta sección, hemos aprendido sobre los constructores y destructores en C++. Los constructores se utilizan para inicializar objetos, mientras que los destructores se utilizan para limpiar recursos cuando los objetos ya no son necesarios. Comprender estos conceptos es crucial para gestionar correctamente la memoria y los recursos en programas orientados a objetos.
En el próximo tema, exploraremos la herencia, un concepto fundamental en la Programación Orientada a Objetos que permite crear nuevas clases basadas en clases existentes.
Curso de Programación en C++
Módulo 1: Introducción a C++
- Introducción a C++
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Entrada y Salida
Módulo 2: Estructuras de Control
Módulo 3: Funciones
- Introducción a las Funciones
- Parámetros de Función y Tipos de Retorno
- Sobrecarga de Funciones
- Recursión
Módulo 4: Arreglos y Cadenas
- Introducción a los Arreglos
- Arreglos Multidimensionales
- Introducción a las Cadenas
- Manipulación de Cadenas
Módulo 5: Punteros y Referencias
- Introducción a los Punteros
- Aritmética de Punteros
- Punteros y Arreglos
- Referencias
- Asignación Dinámica de Memoria
Módulo 6: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulación y Abstracción
Módulo 7: Temas Avanzados
- Plantillas
- Manejo de Excepciones
- Entrada/Salida de Archivos
- Biblioteca Estándar de Plantillas (STL)
- Expresiones Lambda
- Multihilo