En C++, l'ordre d'initialisation des membres de la classe se fait toujours dans l'ordre dans lequel ils sont déclarés dans le corps de la classe, et non dans l'ordre dans lequel ils sont spécifiés dans la liste d'initialisation du constructeur.
Exemple :
struct Foo { int a; int b; Foo() : b(2), a(b) {} };
Dans cet exemple, a sera d'abord initialisé avec la valeur de la variable indéfinie b, car a est initialisé avant b, indépendamment de l'ordre dans la liste d'initialisation. En fin de compte, a ne sera pas égal à 2.
La bonne méthode : lors de l'initialisation, se référer uniquement aux membres déjà déclarés ci-dessus ou utiliser des constantes.
Dans quel ordre les membres de la classe seront-ils initialisés si l'ordre d'initialisation dans le constructeur est différent de celui de la déclaration ?
Réponse : Le membre qui est déclaré en premier dans la classe est toujours initialisé en premier, indépendamment de l'ordre dans la liste d'initialisation du constructeur. Cela peut entraîner des erreurs en cas de dépendance mutuelle entre les membres de la classe.
Histoire
Dans une classe complexe, lors de l'initialisation d'une référence à un membre de classe, un autre membre n'était pas initialisé. Il s'est avéré que l'ordre dans la liste d'initialisation n'avait pas d'importance, et cela a conduit à l'utilisation de mémoire non initialisée. Le logiciel plantait uniquement avec certains compilateurs et configurations.
Histoire
Lors de l'ajout d'un nouveau membre au milieu de la classe sans ajuster l'ordre d'initialisation des membres dépendants, une erreur a été détectée uniquement lors d'une analyse de code statique. La variable prenait une valeur invalide en raison de l'ancien ordre de déclaration.
Histoire
Une nouvelle version de la bibliothèque modifiait le code source de la classe et changeait l'ordre des membres, sans changer le constructeur. En conséquence, les valeurs dans l'application fonctionnaient avec des données invalides : l'ingénieur ne pouvait pas comprendre la cause jusqu'à ce qu'il voie un avertissement du compilateur concernant l'ordre d'initialisation.