'explicit' est un mot clef trop souvent oublié pourtant il est tres utile En fait il force le compilateur à ne pas faire trop de zèle. Par exemple, vous avez une simple classe Foo qui a un constructeur Foo(int). Vous vous en servez allègrement pour faire des conversions implicites de int -> Foo, et ça vous convient très bien. seulement voilà, un jour vous avez un problème insoluble, ou vous voulez enpecher ces conversions implicites, ou tout simplement vous voulez mieux vous rendre compte du nombre de conversions implicites que fait votre compilateur? explicit est là! c'est un qualificateur pour les constructeurs qui se place jsute avant le nom de du constructeur.
petit exemple parlant. essayer avec et sans le explicit
Code :
- #include <iostream>
- using namespace std;
- class Foo
- {
- int i;
-
- public:
-
- Foo()
- {
- cout << "Constructeur trivial" << " &" << &i << endl;
- }
-
- /* explicit */ Foo(int j)
- : i(j)
- {
- cout << "Constructeur i = " << i << " &" << &i << endl;
- }
-
- Foo(const Foo &f)
- : i(f.i)
- {
- cout << "Constructeur par recopie i = " << i << " &" << &i << " (source &" << &f.i << ')' << endl;
- }
-
- ~Foo()
- {
- cout << "~Destructeur i = " << i << " &" << &i << endl;
- }
-
- Foo& operator+=(const Foo &other)
- {
- this->i+=other.i;
- return *this;
- }
- };
- Foo operator+(const Foo &f, const Foo &g)
- {
- cout << "operator+(Foo, Foo)" << endl;
- Foo tmp(f);
- tmp+=g;
- return tmp;
- }
- Foo dawa(Foo f)
- {
- return 0;
- }
- int main()
- {
- Foo a;
- Foo b(2);
- Foo c=3;
- Foo d(b);
- b+4;
-
- dawa(5);
- }
|