Liste d'initialisation vs corps de constructeur : plongée dans l'initialisation de champ
Dans le monde de la programmation orientée objet avec C, une tâche courante est initialisation des champs de classe. Bien que la liste d'initialisation et le corps du constructeur offrent deux manières distinctes de procéder, il est essentiel de comprendre la différence subtile entre eux.
Liste d'initialisation
La syntaxe de la liste d'initialisation vous permet pour initialiser les variables membres juste au début du constructeur, avant que son corps ne s'exécute. Ceci est réalisé en utilisant le symbole :, suivi d'une liste d'affectations séparées par des virgules :
public: Thing(int _foo, int _bar): member1(_foo), member2(_bar) {}
Corps du constructeur
Dans le corps du constructeur, l'initialisation du champ se produit dans les accolades (après la liste des paramètres). Chaque champ est attribué explicitement à l'aide du signe égal :
public: Thing(int _foo, int _bar) { member1 = _foo; member2 = _bar; }
Différence pour les types non-POD
Lorsque vous traitez des types non-POD (Plain Old Data), il existe une distinction cruciale entre ces deux méthodes. Contrairement à la liste d'initialisation, qui initialise ces champs immédiatement, le corps du constructeur ne les initialise qu'après le début de l'exécution de son corps.
Cela signifie que le corps du constructeur appelle implicitement le constructeur par défaut pour chaque membre non-POD, potentiellement ce qui entraîne une double initialisation. Par exemple :
public: Thing(int _foo, int _bar) { member1 = _foo; member2 = _bar; }
Cela équivaut effectivement à :
public: Thing(int _foo, int _bar) : member1(), member2() { member1 = _foo; member2 = _bar; }
Implications sur la sécurité
Cette différence peut avoir des implications sur la sécurité. Si un membre non-POD n'a pas de constructeur par défaut, l'utilisation du corps du constructeur entraînera une erreur de compilation. En revanche, la liste d'initialisation ignorera simplement l'initialisation du membre, ce qui peut être souhaitable ou indésirable selon la situation.
Paramètres par défaut
La liste d'initialisation et le constructeur le corps prend en charge les valeurs des paramètres par défaut. Cependant, le comportement est identique et le choix de la méthode n'influence pas la façon dont les paramètres par défaut sont gérés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!