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
 
 s'abonner
s'abonner