Historique de la question :
Dans les anciennes versions de C++, tous les membres de la classe devaient être initialisés soit dans la liste d'initialisation du constructeur, soit dans le corps du constructeur. Avec l'arrivée de C++11, il est devenu possible d'initialiser les membres non статiques de la classe directement à l'endroit de leur définition — ce qui a considérablement amélioré la lisibilité et réduit la probabilité d'erreurs liées aux variables non initialisées.
Problème :
L'absence d'initialisation par défaut conduisait à un comportement non évident pour les développeurs, surtout lors de l'apparition de nouveaux constructeurs. Il n'y avait aucune garantie que les membres de la classe soient toujours initialisés. La beauté et la nouveauté de l'approche résident dans la réduction du code boilerplate.
Solution :
L'initialisation en ligne définit une valeur par défaut pour un membre de classe si celui-ci n'a pas été clairement initialisé dans la liste d'initialisation du constructeur.
Exemple de code :
class Widget { int value = 42; std::string name{"default"}; public: Widget() {} Widget(int v) : value(v) {} };
Caractéristiques clés :
La valeur de l'initialisation en ligne sera-t-elle utilisée si le membre est spécifié dans la liste d'initialisation du constructeur ?
Non, c'est la valeur de la liste d'initialisation du constructeur qui sera utilisée. Exemple :
class Test { int a = 10; public: Test(int x) : a(x) {} }; Test t(42); // a == 42
Peut-on initialiser des membres статiques de la classe en ligne ?
Non, seulement les membres non статiques. Les membres статiques de la classe sont initialisés séparément en dehors de la classe.
Peut-on utiliser des expressions pour l'initialisation des membres de la classe en ligne ?
Pour les membres simples — oui (par exemple, appel de constructeur ou littéral). Pour des calculs complexes, utilisez une fonction ou une initialisation dans le constructeur.
L'équipe a ajouté un nouveau constructeur, mais a oublié d'initialiser un champ. Celui-ci est resté avec une valeur non initialisée. Un crash survenait lors de l'accès à la variable.
Avantages :
Inconvénients :
L'initialisation en ligne a été appliquée à tous les champs de la classe. Dans les nouveaux constructeurs, il n'était plus nécessaire d'écrire l'initialisation explicitement, ce qui a réduit la quantité de code boilerplate et d'erreurs.
Avantages :
Inconvénients :