Costruttore predefinito
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 18 di 104.
Un costruttore predefinito è un costruttore che può essere chiamato senza argomenti. Inizializza un oggetto quando non vengono forniti valori iniziali. Ogni classe ha bisogno di un modo per creare oggetti in uno stato predefinito valido.
Se non definisci alcun costruttore, il compilatore genera un costruttore predefinito implicito che non fa nulla per i tipi primitivi e chiama i costruttori predefiniti per gli oggetti membro.
class Player {
int health;
int score;
public:
Player() { // Costruttore predefinito
health = 100;
score = 0;
}
};
Player p1; // Chiama il costruttore predefinito
Player p2{}; // Chiama anche il costruttore predefinitoUna volta definito un qualsiasi costruttore (come uno con parametri), il compilatore non genera più un costruttore predefinito. Se ti serve ancora, devi definirne uno esplicitamente.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // Solo costruttore parametrizzato
};
Enemy e1(10); // Funziona
Enemy e2; // Errore! Nessun costruttore predefinitoIn C++ moderno, puoi richiedere esplicitamente il costruttore predefinito generato dal compilatore usando = default:
class Item {
int id;
public:
Item() = default; // Il compilatore genera il costruttore predefinito
Item(int i) : id(i) {}
};I costruttori predefiniti sono essenziali per creare array di oggetti e per le classi utilizzate in contenitori come std::vector, che potrebbero dover costruire elementi senza argomenti.
Sfida
FacileCostruiamo un semplice sistema di contatori che mostra come i costruttori predefiniti inizializzino gli oggetti in uno stato iniziale valido.
Creerai due file per organizzare il codice:
Counter.h: definisci una classeCounterche tiene traccia di un conteggio. La classe dovrebbe avere:- Un attributo privato
count(intero) - Un attributo privato
name(stringa) per identificare il contatore - Un costruttore predefinito che inizializza
counta0enamea"Unnamed", poi stampa"Counter created: <name>" - Un metodo
increment()che aumenta il conteggio di 1 - Un metodo
getCount()che restituisce il conteggio corrente - Un metodo
getName()che restituisce il nome del contatore
- Un attributo privato
main.cpp: mostra che i costruttori predefiniti funzionano quando si creano oggetti in modi diversi. Leggi un numero dall'input che indica quante volte incrementare il contatore, poi:- Crea un Counter usando l'inizializzazione diretta:
Counter c1; - Crea un altro Counter usando l'inizializzazione con parentesi graffe:
Counter c2{}; - Incrementa
c1il numero di volte specificato dall'input - Stampa
"<name>: <count>"per c1 - Stampa
"<name>: <count>"per c2
- Crea un Counter usando l'inizializzazione diretta:
Entrambi i contatori dovrebbero iniziare da 0 grazie al costruttore predefinito, ma verrà incrementato solo c1. Questo mostra come i costruttori predefiniti assicurino che ogni oggetto inizi in uno stato prevedibile e valido, indipendentemente da come viene creato.
Includi il tuo file header in main.cpp usando #include "Counter.h".
Provalo tu
#include <iostream>
#include "Counter.h"
using namespace std;
int main() {
// Leggi il numero di volte in cui incrementare
int n;
cin >> n;
// TODO: Crea un Counter usando l'inizializzazione diretta: Counter c1;
// TODO: Crea un altro Counter usando l'inizializzazione con parentesi graffe: Counter c2{};
// TODO: Incrementa c1 il numero di volte specificato da n
// TODO: Stampa "<name>: <count>" per c1
// TODO: Stampa "<name>: <count>" per c2
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