Definición de clases y creación de objetos
Definición de clases
Una clase es una plantilla o molde que define:
- Atributos (también llamados miembros de datos): variables que representan el estado de los objetos.
- Métodos (también llamados funciones miembro): funciones que representan el comportamiento de los objetos.
La clase encapsula estos elementos y define cómo los objetos deben comportarse. Veamos un ejemplo:
#include <iostream>
class Rectangulo {
public:
double base;
double altura;
// Método para calcular el área
double calcularArea() const {
return base * altura;
}
// Método para establecer las dimensiones (si se desea cambiar después de la creación)
void establecerDimensiones(double b, double h) {
base = b;
altura = h;
}
};
int main() {
// Crear el objeto con el constructor y pasar las dimensiones directamente
Rectangulo r1;
r1.base=3.0;
r1.altura=5.0;
std::cout << "Área del rectángulo: " << r1.calcularArea() << std::endl;
// Si se desea cambiar las dimensiones después de la creación
r1.establecerDimensiones(7.0, 4.0);
std::cout << "Área del rectángulo actualizado: " << r1.calcularArea() << std::endl;
return 0;
}
En este ejemplo:
baseyalturason atributos públicos.- Los métodos
establecerDimensionesycalcularAreason públicos y permiten manipular el estado del objeto y realizar cálculos. - Los métodos, al ser funciones miembro, pueden recibir argumentos y retornar valores como cualquier función en C++. Las distintas formas de paso de argumentos y retorno de valores es igual a las estudiadas con las funciones.
Creación e inicialización de objetos
Un objeto es una instancia concreta de una clase. Cada objeto tiene su propio estado (valores de los atributos) y puede ejecutar los métodos definidos por la clase. En el ejemplo:
Rectangulo r1;
r1.base=3.0;
r1.altura=5.0;
En este caso:
- Se crea un objeto
r1de tipoRectangulo. - Como los atributos son públicos, se pueden inicializar. Para acceder a los atributos utilizamos el punto.
Introducción a los constructores y destructores
Un constructor es un método especial cuyo nombre coincide con el de la clase y que no tiene tipo de retorno. Se ejecuta automáticamente al crear un objeto y se utiliza para inicializar sus atributos.
Tipos de constructores:
- Constructor por defecto: no recibe argumentos e inicializan los atributos a valores por defecto.
- Constructor parametrizado: recibe argumentos para inicializar atributos.
Un destructor es un método especial que se ejecuta automáticamente cuando un objeto sale de su ámbito de vida (final de un bloque de código). No lo vamos a declarar y vamos a dejar que se ejecute el método destructor creado por defecto.
Veamos un ejemplo definiendo los constructores:
#include <iostream>
class Rectangulo {
public:
double base;
double altura;
// Constructor por defecto
Rectangulo() {
base = 0.0;
altura = 0.0;
}
// Constructor con parámetros
Rectangulo(double b, double h) {
base = b;
altura = h;
}
// Método para calcular el área
double calcularArea() const {
return base * altura;
}
// Método para establecer las dimensiones usando inicialización uniforme
void establecerDimensiones(double b, double h) {
base = b;
altura = h;
}
};
int main() {
// Crear un objeto usando el constructor por defecto
Rectangulo r1;
std::cout << "Área del rectángulo r1 (por defecto): " << r1.calcularArea() << std::endl;
// Crear un objeto usando el constructor con parámetros
Rectangulo r2(5.0, 3.0);
std::cout << "Área del rectángulo r2 (con parámetros): " << r2.calcularArea() << std::endl;
// Modificar las dimensiones de r1 usando el método establecerDimensiones
r1.establecerDimensiones(7.0, 4.0);
std::cout << "Área del rectángulo r1 después de actualizar dimensiones: " << r1.calcularArea() << std::endl;
return 0;
}
- En este caso se crea el
Rectangulo r1usando el constructor por defecto:Rectangulo r1()y se crea elRectangulo r2usando el constructor con argumentos:Rectangulo r2(5.0, 3.0);.
Constructores con lista de inicialización
Los constructores con lista de inicialización son una forma especial de inicializar directamente los miembros de una clase. En el ejemplo anterior, no se usó los constructores con lista de incialización, por lo tanto:
- Todos los miembros se construyen primero con su constructor por defecto (o con una inicialización por defecto implícita).
- Luego, en el cuerpo del constructor, se asigna un nuevo valor a esos miembros.
Al usar listas de incialización, los atributos se construyen directamente con el valor que les pasas en la lista. Por ejemplo:
#include <iostream>
class Rectangulo {
public:
double base;
double altura;
// Constructor por defecto usando lista de inicialización
Rectangulo() : base{0.0}, altura{0.0} {}
// Constructor con parámetros usando lista de inicialización
Rectangulo(double b, double h) : base{b}, altura{h} {}
// Método para calcular el área
double calcularArea() const {
return base * altura;
}
// Método para establecer las dimensiones
void establecerDimensiones(double b, double h) {
base = b;
altura = h;
}
};
int main() {
// Crear un objeto usando el constructor por defecto
Rectangulo r1; // No hace falta poner los () se ejecuta el constructor por defecto.
std::cout << "Área del rectángulo r1 (por defecto): " << r1.calcularArea() << std::endl;
// Crear un objeto usando el constructor con parámetros
Rectangulo r2(5.0, 3.0);
std::cout << "Área del rectángulo r2 (con parámetros): " << r2.calcularArea() << std::endl;
// Modificar las dimensiones de r1 usando el método establecerDimensiones
r1.establecerDimensiones(7.0, 4.0);
std::cout << "Área del rectángulo r1 después de actualizar dimensiones: " << r1.calcularArea() << std::endl;
return 0;
}