Construtor Parametrizado
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 19 de 104.
Um construtor parametrizado aceita argumentos que permitem inicializar um objeto com valores específicos no momento da criação. Em vez de depender de valores padrão, você pode personalizar o 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);Você pode definir múltiplos construtores parametrizados com diferentes listas de parâmetros. Isso é chamado de sobrecarga de construtor, e o compilador seleciona o apropriado com base nos argumentos que você fornece.
class Rectangle {
int width, height;
public:
Rectangle(int side) { // Quadrado
width = height = side;
}
Rectangle(int w, int h) { // Retângulo
width = w;
height = h;
}
};
Rectangle square(10); // Chama o primeiro construtor
Rectangle rect(10, 20); // Chama o segundo construtorParâmetros podem ter valores padrão, tornando alguns argumentos opcionais. Isso reduz a necessidade de múltiplos construtores sobrecarregados.
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // o dano assume o padrão 10
Enemy dragon("Dragon", 50); // dano definido como 50Lembre-se da lição anterior: uma vez que você define um construtor parametrizado, o compilador não gera mais um construtor padrão automaticamente. Se você precisar de ambos, deve definir o construtor padrão explicitamente.
Desafio
FácilVamos construir um sistema de inventário de produtos que demonstra como os construtores parametrizados permitem criar objetos com valores iniciais específicos e como a sobrecarga de construtores oferece flexibilidade na criação de objetos.
Você criará dois arquivos para organizar seu código:
Product.h: Defina uma classeProductque representa itens em um inventário. Sua classe deve ter:- Atributos privados para
name(string),price(double), equantity(inteiro) - Um construtor que recebe todos os três parâmetros (name, price, quantity) para inicializar totalmente um produto
- Um construtor que recebe apenas name e price, com quantity assumindo o valor padrão
1 - Um construtor que recebe apenas um name, com price assumindo o valor padrão
0.0e quantity assumindo o valor padrão0 - Um método
display()que imprime as informações do produto no formato:"<name>: $<price> (x<quantity>)" - Um método
getTotalValue()que retorna o preço multiplicado pela quantidade
- Atributos privados para
main.cpp: Demonstre todos os três construtores lendo a entrada e criando produtos de diferentes maneiras. Leia o seguinte da entrada:- Primeira linha: o nome de um produto, preço e quantidade (separados por espaço)
- Segunda linha: o nome de um produto e preço (separados por espaço)
- Terceira linha: apenas o nome de um produto
display()em cada um e, em seguida, imprima o valor total de todos os três produtos combinados no formato:"Total inventory value: $<value>"
Para a saída do preço, exiba com duas casas decimais. Por exemplo, se você criar um produto "Laptop" com preço 999.99 e quantidade 5, a exibição deve mostrar "Laptop: $999.99 (x5)".
Inclua seu arquivo de cabeçalho no main.cpp usando #include "Product.h".
Experimente você mesmo
#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// Ler o primeiro produto: nome, preço e quantidade
string name1;
double price1;
int quantity1;
cin >> name1 >> price1 >> quantity1;
// Ler o segundo produto: nome e preço
string name2;
double price2;
cin >> name2 >> price2;
// Ler o terceiro produto: apenas o nome
string name3;
cin >> name3;
// TODO: Criar três objetos Product usando o construtor apropriado para cada um
// TODO: Chamar display() em cada produto
// TODO: Calcular e imprimir o valor total do inventário
// Formato: "Total inventory value: $<value>"
// Use fixed e setprecision(1) para uma casa decimal
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online