Entra

View Full Version : [c++] costruttore con :


mistergks
24-01-2015, 22:01
Qualcuno mi spiega questo tipo di costruttore come funziona?


Prodotto(string n, string m) : nome(n), marca(m) { }



So che nome(n) e marca(m) stanno per Nome=n e marca=m ma perche viene scritto con i due punti e non nel corpo della funzione?

wizard1993
25-01-2015, 00:29
se non ricordo male quello specifico costrutto server per inizializzare delle costanti membro

mistergks
25-01-2015, 12:17
Non ho capito

vendettaaaaa
25-01-2015, 12:50
class A
{
int a;
const int b;

// Costruttore sbagliato: non compila
A(int aa, int bb)
{
a = aa;
b = bb;
}

// Costruttore giusto: compila
A(int aa, int bb) : b(bb)
{
a = aa;
}
}

Gli oggetti di classe A hanno 2 membri: uno const, l'altro no.
Dato che b è const, non puoi assegnarle un valore scrivendo b = bb. Fin qui tutto chiaro. Per questo il primo costruttore NON compila.
Ma allora, come le assegno un valore?
Tutte le variabili const possono, e devono, essere inizializzate con un valore in fase di costruzione (quando vengono create in memoria). Quindi, quando io sto costruendo un oggetto di una classe, viene riservata una zona di memoria adatta a contenerlo e le variabili membro possono essere inizializzate. Per farlo, usi la sintassi di inizializzazione (quella con : ), cioè tutte le variabili membro scritte dopo : e prima del corpo del costruttore vengono inizializzate. Qui devi assegnare un valore alle variabili membro che sono const. Solo DOPO la costruzione dell'oggetto viene eseguito il corpo del costruttore, quindi è per questo che i membri const non possono essere assegnati nel corpo del costruttore.
In breve: usando l'inizializzazione, le variabili membro sono inizializzate contestualmente alla creazione dell'oggetto di quella classe; il corpo del costruttore viene eseguito dopo la creazione dell'oggetto, quindi è come chiamare una funzione membro su un oggetto già costruito.

[Kendall]
25-01-2015, 13:09
Qualcuno mi spiega questo tipo di costruttore come funziona?


Prodotto(string n, string m) : nome(n), marca(m) { }



So che nome(n) e marca(m) stanno per Nome=n e marca=m ma perche viene scritto con i due punti e non nel corpo della funzione?

Quando chiami un costruttore, prima di eseguire il corpo stesso, avvengono certe cose, in particolare: viene inizializzata la superclasse (se esiste) e poi vengono inizializzati i campi con il loro costruttore di base ( Type() ).
Pertanto la "Lista di Inizializzazione" (così viene chiamata) serve per specificare dei costruttori alternativi a quelli di default.

Questo cosa significa? Beh, essenzialmente che se hai dei tipi definiti come costanti l'unica possibilità per modificare il loro valore è all'interno di questa lista di inizializzazione, altrimenti nel corpo del costruttore non potrai farlo.
Altra motivazione è il voler evitare che il costruttore di default venga chiamato (questo può essere utile nel caso il costruttore di un determinato tipo sia particolarmente esoso a livello di risorse e pertanto preferisci chiamare il costruttore solo una volta).

mistergks
25-01-2015, 18:14
Ho capito ora. E ho visto alcuni esempi in cui mettono il costruttore della classe base dopo i :