C++ – Ordre d’initialisation
On a vu l’importance des listes d’initialisation mais il est un point important dont il faut se souvenir: les variables ne sont pas nécessairement initialisées dans l’ordre où elles sont dans la liste d’initialisation. En fait, l’ordre d’initialisation dépend de l’ordre dans lequel elles sont déclarées.
class A { public: A() : a(10), b(20) {} private: int b; int a; };
Dans la classe ci-dessus, b est initialisé le premier et a ensuite, conformément à l’ordre de déclaration. Dans ce cas-ci, cela n’a pas d’importance que b soit initialisé avant a mais ce n’est pas toujours vrai.
class A { public: A(size_t len) : length(len), buf(new char[length]) {} private: char* buf; size_t length; };
Ici, buf est initialisé avant length et cela pose un problème puisque buf doit être initialisé en utilisant length qui n’est pas encore initialisé. Utiliser new avec un argument non-initialisé est un comportement indéfini. En clair, c’est un bug de votre programme.
Posted: juin 1st, 2008 under C++.
Comments: none
Tweet