Constructor con parámetros
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 19 de 104.
Un constructor parametrizado acepta argumentos que te permiten inicializar un objeto con valores específicos en el momento de su creación. En lugar de depender de valores predeterminados, puedes personalizar el estado inicial de cada objeto.
class Player {
std::string name;
int health;
int level;
public:
Player(std::string n, int h, int lvl) {
name = n;
health = h;
level = lvl;
}
};
Player hero("Archer", 100, 5);
Player mage("Wizard", 80, 7);Puedes definir varios constructores parametrizados con distintas listas de parámetros. Esto se denomina sobrecarga de constructores, y el compilador selecciona el adecuado según los argumentos que proporciones.
class Rectangle {
int width, height;
public:
Rectangle(int side) { // Cuadrado
width = height = side;
}
Rectangle(int w, int h) { // Rectángulo
width = w;
height = h;
}
};
Rectangle square(10); // Llama al primer constructor
Rectangle rect(10, 20); // Llama al segundo constructorLos parámetros pueden tener valores predeterminados, lo que hace que algunos argumentos sean opcionales. Esto reduce la necesidad de tener varios constructores sobrecargados.
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // damage tiene 10 como valor predeterminado
Enemy dragon("Dragon", 50); // damage se establece en 50Recuerda lo aprendido en la lección anterior: una vez que defines un constructor con parámetros, el compilador ya no genera automáticamente un constructor predeterminado. Si necesitas ambos, debes definir explícitamente el constructor predeterminado.
Desafío
FácilVamos a crear un sistema de inventario de productos que demuestre cómo los constructores parametrizados permiten crear objetos con valores iniciales específicos y cómo la sobrecarga de constructores aporta flexibilidad a la creación de objetos.
Crearás dos archivos para organizar tu código:
Product.h: Define una claseProductque represente artículos de un inventario. Tu clase debe tener:- Atributos privados para
name(cadena),price(número de punto flotante) yquantity(entero) - Un constructor que reciba los tres parámetros (name, price, quantity) para inicializar completamente un producto
- Un constructor que reciba solo name y price, con quantity establecido en
1de forma predeterminada - Un constructor que reciba solo un name, con price establecido en
0.0y quantity establecido en0de forma predeterminada - Un método
display()que imprima la información del producto con este formato:"<name>: $<price> (x<quantity>)" - Un método
getTotalValue()que devuelva price multiplicado por quantity
- Atributos privados para
main.cpp: Demuestra los tres constructores leyendo la entrada y creando productos de distintas maneras. Lee lo siguiente de la entrada:- Primera línea: el nombre, el precio y la cantidad de un producto (separados por espacios)
- Segunda línea: el nombre y el precio de un producto (separados por espacios)
- Tercera línea: solo el nombre de un producto
display()para cada uno y, después, imprime el valor total de los tres productos combinados con este formato:"Total inventory value: $<value>"
Para mostrar el precio, usa dos cifras decimales. Por ejemplo, si creas un producto "Laptop" con un precio de 999.99 y una cantidad de 5, la visualización debe mostrar "Laptop: $999.99 (x5)".
Incluye tu archivo de encabezado en main.cpp usando #include "Product.h".
Pruébalo tú mismo
#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// Lee el primer producto: nombre, precio y cantidad
string name1;
double price1;
int quantity1;
cin >> name1 >> price1 >> quantity1;
// Lee el segundo producto: nombre y precio
string name2;
double price2;
cin >> name2 >> price2;
// Lee el tercer producto: solo el nombre
string name3;
cin >> name3;
// TODO: Crea tres objetos Product usando el constructor adecuado para cada uno
// TODO: Llama a display() para cada producto
// TODO: Calcula e imprime el valor total del inventario
// Formato: "Total inventory value: $<value>"
// Usa fixed y setprecision(1) para mostrar un decimal
return 0;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosCompilación y construcción en C++Archivos de cabecera y archivos fuenteEspacios de nombres y ámbitoIntroducción a la POO en C++Clases y objetosEl puntero 'this'Métodos (funciones miembro)Atributos (miembros de datos)Fundamentos de constructores y destructoresRepaso: calculadora sencilla4Propiedades de clase
Miembros de instancia vs. estáticosGetters y settersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases friendRepaso: gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de constructores y destructoresSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualRepaso: jerarquía de empleados2Gestión de memoria
Memoria de pila vs. heapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Repaso: gestor de arreglos dinámicos5Encapsulación
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultación de informaciónStruct vs. classClases anidadas e internasRepaso: sistema de registros de estudiantes8Polimorfismo
Polimorfismo en compilación y en tiempo de ejecuciónSobrecarga de funcionesRepaso de las funciones virtualesFunciones virtuales purasClases abstractasDiseño de interfaces en C++Conversión dinámica y RTTIRepaso: calculadora de formas11Conceptos avanzados de POO
Composición frente a herenciaMixins mediante CRTPIdiom PimplBorrado de tiposClases enum y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y destructores
Constructor predeterminadoConstructor con parámetrosConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis detallado del destructorRegla de tres / cinco / ceroRepaso: clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujoSobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tipoRepaso: clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasFundamentos de SFINAE y rasgos de tiposRepaso: contenedor genéricoPractica por tu cuenta: Compilador de C++ online