Maison > développement back-end > C++ > Liste d'initialisation ou corps de constructeur : lequel est le meilleur pour l'initialisation de champ C ?

Liste d'initialisation ou corps de constructeur : lequel est le meilleur pour l'initialisation de champ C ?

Susan Sarandon
Libérer: 2024-12-04 03:31:11
original
819 Les gens l'ont consulté

Initializer List or Constructor Body: Which is Best for C   Field Initialization?

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) {}
Copier après la connexion

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;
}
Copier après la connexion
Copier après la connexion

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;
}
Copier après la connexion
Copier après la connexion

Cela équivaut effectivement à :

public: Thing(int _foo, int _bar) : member1(), member2() {
    member1 = _foo;
    member2 = _bar;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal