Discussione:
Explicit per i costruttori
(troppo vecchio per rispondere)
Noixe
2005-02-21 09:41:31 UTC
Permalink
Salve,

sul mio libro, nonostante sia presente il alcuni esempi non cita l'utilita'
di explicit per i costruttori (o forse non lo trovo io).

Il seguente codice:

#include <iostream>

struct A {
explicit A() {
std::cout << "A()" << std::endl;
}
};

int main() {
A a;
return 0;
}

cosa ha di particolare rispetto all'equivalente senza explicit?

Grazie
Max M.
2005-02-21 10:20:57 UTC
Permalink
Post by Noixe
cosa ha di particolare rispetto all'equivalente senza explicit?
La keyword 'explicit' ha senso nelle dichiarazioni di costruttori che
posso essere invocati con un singolo parametro (cioè costruttori che
prevedono N parametri ed N-1 valori di default, con N >0 ).

Il costuttore dichiarato 'explicit' non può partecipare a una conversione
implicita. Quindi:

struct A { A() {} A(int) {} };
struct B { B() {} explicit B(int) {} };
int main()
{
A a;
B b;

a = 1; // compila; 1 viene implicitamente convertito in A(1)
b = 1; // NON compila!
}

Max
int i=00;
2005-02-21 11:12:30 UTC
Permalink
Post by Noixe
sul mio libro, nonostante sia presente il alcuni esempi non cita l'utilita'
di explicit per i costruttori (o forse non lo trovo io).
Serve ad evitare che un costruttore con un parametro o più, se gli altri
hanno default, venga usato per una conversione implicita o automatica
col tipo di quel parametro quando non c'è operator= con quel tipo.

struct A {
A(int i_) : i(i_) {};
int i;
}
int f(A const& a) { return a.i; }

chiamando f(1) costruisce automaticamente o implicitamente un oggetto
anomino o temporaneo A(1) e lo passa ad f. Se il costruttore fosse
explicit, per ottenere lo stesso risultato dovresti fare f(A(1)) invece
di f(1).

A a(0);
a = 1;

anche qui viene costruito un A(1), dal momento che non c'è un
operator=(int).

L'utilità dipende da quello che fai. In genere dichiarare explicit un
costruttore ad un solo parametro o riconducibile a tale se gli altri
hanno default, aiuta ad evitare un automatismo che postresti non
desiderare.
Il classico esempio è il costruttore di un container con un parametro
int che indica la dimensione degli elementi allocati all'inizio. È anche
un operatore di conversione per gli int, ma non lo volevi come tale.

Saluti
--
int
Noixe
2005-02-21 18:55:02 UTC
Permalink
Post by int i=00;
L'utilità dipende da quello che fai.
Ok. Volevo sapere in pratica quando usarlo, grazie a tutti per info.
Loading...