View Full Version : [C++] costruttori
mistergks
24-04-2013, 19:44
Allora: io conosco tre tipi di costruttori:
quello generico con nomeclasse();
quello di default: nomeclasse(int x, int y ,int z);
e quello di copia: nomeclasse(nomeclasse &x);
qualcuno mi spiega bene a cosa servono tutti e tre e le differenze tra i vari tipi di costruttore? non trovo chiaro nessun libro su quest'argomento!
Inoltre: perchè alcune volte viene implementato cosi?
nomeclasse(.........)
: x=val, y=z;
{
}
mistergks
24-04-2013, 21:56
Allora: io conosco tre tipi di costruttori:
quello generico con nomeclasse();
quello di default: nomeclasse(int x, int y ,int z);
e quello di copia: nomeclasse(nomeclasse &x);
qualcuno mi spiega bene a cosa servono tutti e tre e le differenze tra i vari tipi di costruttore? non trovo chiaro nessun libro su quest'argomento!
Inoltre: perchè alcune volte viene implementato cosi?
nomeclasse(.........)
: x=val, y=z;
{
}
Up
Inviato dal mio GT-I9003 usando Tapatalk
vendettaaaaa
24-04-2013, 23:00
Allora: io conosco tre tipi di costruttori:
quello generico con nomeclasse();
quello di default: nomeclasse(int x, int y ,int z);
e quello di copia: nomeclasse(nomeclasse &x);
qualcuno mi spiega bene a cosa servono tutti e tre e le differenze tra i vari tipi di costruttore? non trovo chiaro nessun libro su quest'argomento!
Inoltre: perchè alcune volte viene implementato cosi?
nomeclasse(.........)
: x=val, y=z;
{
}
Quello che chiami generico è il default constructor, che non prende argomenti. E' grazie a questo costruttore che puoi dichiarare una variabile di una certa classe senza specificare argomenti:
class MyClass
{
private:
int a;
public:
MyClass() { }
};
MyClass mc; // OK, posso farlo perchè c'è il costruttore di default
Viene sintetizzato dal compilatore automaticamente se NON dichiari alcun costruttore per la tua classe.
class MyClass
{
private:
int a;
public:
MyClass(int aa) : a(aa) { }
};
MyClass mc; // NON COMPILA: non è stato esplicitamente dichiarato un costruttore di default, e avendone specificato un altro, il compilatore non me lo ha sintetizzato
Quello che chiami default non è un default. L'hai messo tu arbitrariamente.
Il copy constructor prende come argomento una const nomeclasse&, non una nomeclasse&. Questo costruttore viene sempre sintetizzato dal compilatore se non lo dichiari esplicitamente. Così come il distruttore. Serve per poter scrivere:
MyClass a;
MyClass b = a;
MyClass c(b);
Non ci sono "tipi" di costruttori definiti, però. Un costruttore è una funzione che fa qualsiasi cosa tu gli dica. Può anche semplicemente scrivere un messaggio, senza toccare i membri della classe. Ovviamente però di norma un costruttore ha lo scopo di inizializzare i membri delle classi con valori di default e/o valori inseriti dall'utente quando crea un oggetto di quella classe.
La seguente sintassi:
class MyClass
{
private:
int a;
public:
MyClass(int aa) : a(aa) { }
}
significa che il membro privato a viene inizializzato con il valore aa, come prima cosa, prima ancora di entrare nel corpo del costruttore. Se scrivessi invece:
class MyClass
{
private:
int a;
public:
MyClass(int aa) { a = aa; }
}
il membro a verrebbe inizializzato al valore di default per gli interi (cioè a 0) e poi aa verrebbe assegnato ad a, facendo un passaggio in più. E' sempre da preferire l'inizializzazione, sebbene stilisticamente più brutta da vedere.
mistergks
25-04-2013, 00:42
Quello che chiami generico è il default constructor, che non prende argomenti. E' grazie a questo costruttore che puoi dichiarare una variabile di una certa classe senza specificare argomenti:
class MyClass
{
private:
int a;
public:
MyClass() { }
};
MyClass mc; // OK, posso farlo perchè c'è il costruttore di default
Viene sintetizzato dal compilatore automaticamente se NON dichiari alcun costruttore per la tua classe.
class MyClass
{
private:
int a;
public:
MyClass(int aa) : a(aa) { }
};
MyClass mc; // NON COMPILA: non è stato esplicitamente dichiarato un costruttore di default, e avendone specificato un altro, il compilatore non me lo ha sintetizzato
Quello che chiami default non è un default. L'hai messo tu arbitrariamente.
Il copy constructor prende come argomento una const nomeclasse&, non una nomeclasse&. Questo costruttore viene sempre sintetizzato dal compilatore se non lo dichiari esplicitamente. Così come il distruttore. Serve per poter scrivere:
MyClass a;
MyClass b = a;
MyClass c(b);
Non ci sono "tipi" di costruttori definiti, però. Un costruttore è una funzione che fa qualsiasi cosa tu gli dica. Può anche semplicemente scrivere un messaggio, senza toccare i membri della classe. Ovviamente però di norma un costruttore ha lo scopo di inizializzare i membri delle classi con valori di default e/o valori inseriti dall'utente quando crea un oggetto di quella classe.
La seguente sintassi:
class MyClass
{
private:
int a;
public:
MyClass(int aa) : a(aa) { }
}
significa che il membro privato a viene inizializzato con il valore aa, come prima cosa, prima ancora di entrare nel corpo del costruttore. Se scrivessi invece:
class MyClass
{
private:
int a;
public:
MyClass(int aa) { a = aa; }
}
il membro a verrebbe inizializzato al valore di default per gli interi (cioè a 0) e poi aa verrebbe assegnato ad a, facendo un passaggio in più. E' sempre da preferire l'inizializzazione, sebbene stilisticamente più brutta da vedere.
Grazie!!! Mi rimane un dubbio ancora.. a me sembra facciano quasi tutti la stessa cosa! Perche in alcune classi vengono esplicitati tutti e tre?
vendettaaaaa
25-04-2013, 09:40
Grazie!!! Mi rimane un dubbio ancora.. a me sembra facciano quasi tutti la stessa cosa! Perche in alcune classi vengono esplicitati tutti e tre?
Lo scopo dei costruttori è inizializzare alcuni o tutti i membri della classe, quindi più o meno fanno la stessa cosa (perlomeno in classi semplici).
Il primo, come già detto, viene quasi sempre esplicitato per poter dichiarare un oggetto di tale classe senza specificare argomenti, e poter scrivere "MyClass a;"
Quello di copia viene spesso esplicitato perchè permette di scrivere "MyClass a = b;" (dove b è di classe MyClass, ovviamente), che è un operazione altamente frequente.
Nota bene che quello di copia dovrebbe di norma copiare il valore dei membri da un oggetto a quello nuovo, tutto qui, quindi la logica di funzionamento è sempre la stessa e il compilatore è in grado di sintetizzarlo per questo motivo. Quindi normalmente anche quando viene esplicitato, non fa altre cose oltre a questo, ma c'è chi potrebbe desiderare di aggiungere altre logiche di funzionamento.
mistergks
26-04-2013, 16:37
bene...ho capito!
mentre quello generico? può fare operazioni varie in pratica :-)
questo costruttore inizializzato...perchè viene inizializzato cosi?
Time::Time( int hr, int min, int sec )
: h(hr), m(min), s(sec) { }
e non cosi??
[code]
Time::Time( int hr, int min, int sec ){
h(hr), m(min), s(sec)
}
vendettaaaaa
26-04-2013, 17:23
bene...ho capito!
mentre quello generico? può fare operazioni varie in pratica :-)
questo costruttore inizializzato...perchè viene inizializzato cosi?
Time::Time( int hr, int min, int sec )
: h(hr), m(min), s(sec) { }
e non cosi??
[code]
Time::Time( int hr, int min, int sec ){
h(hr), m(min), s(sec)
}
Nel primo modo, i membri della classe sono inizializzati, nel secondo, sono assegnati. Vai a rivederti le differenze :) Cmq l'ho già spiegato qualche post sopra.
mistergks
26-04-2013, 19:27
Inzializzazione e assegnamento non equivalgono?
Ora riguardo
Inviato dal mio GT-I9003 usando Tapatalk
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.