Primo, qualsiasi costruttore può essere contrassegnato con explicit
. Quanti argomenti ha è irrilevante.
Con questo fuori strada, ora è necessario capire cosa significa veramente . Significa solo che l'unico modo che il costruttore può essere chiamato è quando si esplicitamente specificare il nome della classe:
struct foo
{
foo(int){}
explicit foo(double){}
};
void bar(foo){}
bar(5); // okay, calls foo(int) to construct the foo
bar(3.14); // error, cannot call foo(double) because foo was not explicitly used
bar(foo(3.14)); // okay, calls foo(double) to construct the foo
La ragione per cui non segniamo costruttori multipla argomento esplicito è perché è inutile. Dato:
struct baz
{
baz(int, int, int);
};
Come altro si può chiamare quel costruttore diverso da dire baz
comunque? (Come in baz(1, 2, 3)
.) †
Nel tuo esempio, explicit
sarebbe ragionevole perché si poteva chiamata che costruttore con un solo argomento. Ciò che realmente fai dipende solo se ritieni che debba essere implicitamente convertibile o meno.
† Questo non tiene conto degli elenchi di inizializzatori C++ 11. In C++ 11, penso che si potrebbe dire:
void qaz(baz) {}
qaz({1, 2, 3});
e riescono ad ottenere una conversione implicita ad un costruttore a più argomenti, ma io non ne so abbastanza su di inizializzazione-list per fare un commento significativa eccezione come nota a piè di pagina.
Il costruttore esplicito ha un significato diverso. Quello di cui parli riguarda il costruttore con argomenti predefiniti. – Mahesh
@mahesh So che il significato dei costruttori espliciti e la domanda è una domanda :) Va bene, lo riempirò con un esempio. – Ockonal
Nessuno di questi sono costruttori espliciti: non sono contrassegnati con la parola chiave 'explicit'. Intendi * costruttore implicito *? In tal caso, sì, i costruttori possono essere richiamati implicitamente se ai parametri n + 1 vengono assegnati argomenti predefiniti. –