Main menu:

Site search

Categories

juin 2008
L M M J V S D
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Archive

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.