Costruttore con parametri
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 19 di 104.
Un costruttore parametrizzato accetta argomenti che ti consentono di inizializzare un oggetto con valori specifici al momento della creazione. Invece di affidarti ai valori predefiniti, puoi personalizzare lo stato iniziale di ogni oggetto.
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);Puoi definire più costruttori parametrizzati con elenchi di parametri diversi. Questo si chiama sovraccarico dei costruttori e il compilatore seleziona quello appropriato in base agli argomenti che fornisci.
class Rectangle {
int width, height;
public:
Rectangle(int side) { // Quadrato
width = height = side;
}
Rectangle(int w, int h) { // Rectangle
width = w;
height = h;
}
};
Rectangle square(10); // Chiama il primo costruttore
Rectangle rect(10, 20); // Chiama il secondo costruttoreI parametri possono avere valori predefiniti, rendendo alcuni argomenti facoltativi. Questo riduce la necessità di avere più costruttori sovraccaricati.
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // damage è impostato a 10 per impostazione predefinita
Enemy dragon("Dragon", 50); // damage è impostato a 50Ricorda dalla lezione precedente: una volta definito un costruttore con parametri, il compilatore non genera più automaticamente un costruttore predefinito. Se ti servono entrambi, devi definire esplicitamente il costruttore predefinito.
Sfida
FacileCreiamo un sistema di inventario dei prodotti che mostra come i costruttori con parametri permettono di creare oggetti con valori iniziali specifici e come il sovraccarico dei costruttori offre flessibilità nella creazione degli oggetti.
Creerai due file per organizzare il codice:
Product.h: definisci una classeProductche rappresenta gli articoli di un inventario. La classe deve avere:- Attributi privati per
name(stringa),price(double) equantity(intero) - Un costruttore che accetta tutti e tre i parametri (name, price, quantity) per inizializzare completamente un prodotto
- Un costruttore che accetta solo name e price, con quantity impostato per impostazione predefinita a
1 - Un costruttore che accetta solo un name, con price impostato per impostazione predefinita a
0.0e quantity impostato per impostazione predefinita a0 - Un metodo
display()che stampa le informazioni sul prodotto nel formato:"<name>: $<price> (x<quantity>)" - Un metodo
getTotalValue()che restituisce price moltiplicato per quantity
- Attributi privati per
main.cpp: mostra tutti e tre i costruttori leggendo l'input e creando prodotti in modi diversi. Leggi dall'input:- Prima riga: nome, prezzo e quantità di un prodotto (separati da spazi)
- Seconda riga: nome e prezzo di un prodotto (separati da spazi)
- Terza riga: solo il nome di un prodotto
display()su ciascuno, quindi stampa il valore totale dei tre prodotti combinati nel formato:"Total inventory value: $<value>"
Per la stampa del prezzo, visualizzalo con due cifre decimali. Per esempio, se crei un prodotto "Laptop" con prezzo 999.99 e quantità 5, la visualizzazione dovrebbe mostrare "Laptop: $999.99 (x5)".
Includi il file header in main.cpp usando #include "Product.h".
Provalo tu
#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// Leggi il primo prodotto: nome, prezzo e quantità
string name1;
double price1;
int quantity1;
cin >> name1 >> price1 >> quantity1;
// Leggi il secondo prodotto: nome e prezzo
string name2;
double price2;
cin >> name2 >> price2;
// Leggi il terzo prodotto: solo il nome
string name3;
cin >> name3;
// TODO: Crea tre oggetti Product usando il costruttore appropriato per ciascuno
// TODO: Chiama display() su ciascun prodotto
// TODO: Calcola e stampa il valore totale dell'inventario
// Formato: "Total inventory value: $<value>"
// Usa fixed e setprecision(1) per ottenere una cifra decimale
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online