Funzione costruttore
Premesso che sto iniziando a studiare le classi,ho questa classe Bycicle definita nel file bycicle.h:
Poi nell' implementazione della classe( bycicle.cpp):
Non mi è chiaro perchè ha usato due costruttori,uno senza parametri,e l' altro con parametri i tre int c,g ed s.Vi prego,spiegatemelo il più elementarmente possibile
class Bycicle{ public: Bycicle(); Bycicle(int c,int g,int s); // le varie funzioni che cambiano cadence,gear e speed private: int cadence; int gear; int speed; };
Poi nell' implementazione della classe( bycicle.cpp):
Bycicle::Bycicle() {cadence=0;speed=0;gear=0} Bycicle::Bycicle(int c,int g,int s) { cadence=c;speed=s;gear=g} //definizione funzioni
Non mi è chiaro perchè ha usato due costruttori,uno senza parametri,e l' altro con parametri i tre int c,g ed s.Vi prego,spiegatemelo il più elementarmente possibile
Risposte
Principalmente perché può farlo ed è spesso comodo avere una costruttore di default (cioè senza parametri). Ci sono infatti situazione in cui è in effetti necessario. Un altro costruttore che è spesso utile è il costruttore di copia, ma immagino che tu non l'abbia ancora studiato.
Ma cosa fanno di diverso i due costruttori?
Uno inizializza le variabili membro della classe a zero mentre l'altro ai valori che gli vengono passati.
"Mifert4":
Non mi è chiaro perchè ha usato due costruttori,uno senza parametri,e l' altro con parametri i tre int c,g ed s.Vi prego,spiegatemelo il più elementarmente possibile
Avere più costruttori ricade nella possibilità di sovraccaricare (overload) le funzioni membro: avere più funzioni con lo stesso nome che accettano parametri diversi. L'esempio più banale che si può fare è qualcosa del genere:
struct Punto { int x; int y; }; class Segmento { public: Segmento(int xa, int ya, int xb, int xb) { this->xa = xa; this->ya = ya; this->xb = xb; this->yb = yb; } Segmento(Punto a, Punto b) { this->xa = a.x; this->ya = a.y; this->xb = b.x; this->yb = b.x; } int xa; int xb; int ya; int ya; }
Così puoi costruire un oggetto Segmento sia a partire dai 4 valori xa, ya, xb,yb sia da due oggetti Punto.
Segmento s1(1, 1, 10, 10); Punto a(1, 1), b(10, 10); Segmento s2(a, b);
Questo è un esempio abbastanza semplice, ma puoi vedere come rende un po' più flessibile la classe Segmento.
Nel tuo esempio inoltre uno dei costruttori è senza argomenti, e come detto è necessario in alcuni casi (ad esempio se vuoi usare la classe Bycicle nei contenitori standard std::list, std::vector…).
Usare il primo costruttore è equivalente ad usare il secondo passandogli 0, 0, 0:
Bycicle bike1; Bycicle bike2(0, 0, 0); // I due oggetti hanno lo stesso valore: i loro tre campi sono tutti a zero.
In questo caso sarebbe stato meglio usare degli argomenti di default (che però forse non hai ancora affrontato nel libro):
class Bycicle{ public: Bycicle(); Bycicle(int c = 0, int g = 0, int s = 0) { cadence = c; speed = s; gear = g; } // le varie funzioni che cambiano cadence,gear e speed private: int cadence; int gear; int speed; };