En effet, cela empêche les conversions de type inattendues (et généralement indésirables) auxquelles le programmeur ne s'attend pas.
les déclarations "explicite" de constructeurs ont la priorité, à moins qu'il n'y ait une raison impérieuse de laisser de la place aux constructeurs à utiliser pour les conversions de type implicites.
par example,
class Foo {
public:
Foo();
Foo(Foo const &rhs); // copy constructor
Foo& operator=(Foo const &rhs); // copy assignment operator
...
};
Foo f1; // call constructor
Foo f2(f1); // call copy constructor
f1 = f2; // call copy assignment opeator
Foo f3 = f2 // call copy constructor
// et cela est possible en l'absence de "explicit"
dans ce cas, " f1 = f2" est un "copy assignment operator", parcequ'il y a pas
de constructor!!
par contre, " Foo f3 = f2; " , pour cela, "copy constructor"
donc, pour éviter la situation implicitée, on doit mettre "explicit" devant la declaration de constructor!!!
class Foo {
public:
explicit Foo();
explicit Foo(Foo const &rhs); // copy constructor
Foo& operator=(Foo const &rhs); // copy assignment operator
...
};
Foo f1; // call constructor
Foo f2(f1); // call copy constructor
f1 = f2; // call copy assignment opeator
//Foo f3 = f2 // pas possible