Liste d'initialisation du constructeur C++ :pourquoi et comment l'utiliser
Lors de l'instanciation d'objets, les constructeurs gèrent souvent l'initialisation des variables membres. Pour ces membres, une liste d'initialisation des constructeurs fournit un moyen abrégé et efficace de leur initialisation avant l'exécution du corps du constructeur. Outre les performances, cela est parfois également obligatoire en raison de variables const ou de membres d'une classe de base.
Qu'est-ce qu'une liste d'initialisation de constructeur ?
Une liste d'initialisation de constructeur est une procédure permettant d'initialiser directement les variables membres. Par conséquent, aucun constructeur par défaut n'est copié puis attribué.
Syntaxe
La syntaxe suivante d'initialisation de la liste des constructeurs est la suivante−
ClassName(type1 param1, type2 param2) : member1(param1), member2(param2) {
// Constructor body
}
Ici, member1 et member2 sont initialisés avec param1 et param2 avant l'exécution du corps du constructeur.
Exemple de liste d'initialisation de constructeur
Voici un exemple simple montrant comment utiliser une liste d'initialisation.
#include <iostream>
#include <string>
class Student {
public:
Student(const std::string& name, int age) : name(name), age(age) {}
void display() const {
std::cout << "Name: " << name << ", Age: " << age << "\n";
}
private:
std::string name;
int age;
};
int main() {
Student s("Navya", 20);
s.display();
return 0;
}
Sortie
Name: Navya, Age: 20
Pourquoi utiliser les listes d'initialisation de constructeur ?
- Pour éviter une initialisation par défaut suivie d'une réaffectation, afin d'économiser du temps et des ressources.
- C'est obligatoire pour certains types de variables const, de membres de référence et de membres de classe de base.
- Il conserve toute la logique d'initialisation au même endroit, distinct du corps du constructeur.
Cas particuliers
Dans ce qui suit, nous discuterons de quelques cas particuliers pour la liste d'initialisation du constructeur -
Membres const ou de référence
Les variables Const et les membres de référence ne peuvent pas être réaffectés, ils doivent donc être initialisés dans une liste d'initialisation,
class Config {
public:
Config(const std::string& product, const int & model)
: product (product), model(model) {}
private:
const std::string product;
const int & model;
};
Initialisation de la classe de base
Lorsqu'une classe dérivée hérite d'une classe de base, vous pouvez utiliser une liste d'initialisation pour appeler le constructeur de la classe de base,
class Base {
public:
Base(int value) : baseValue(value) {}
protected:
int baseValue;
};
class Derived : public Base {
public:
Derived(int value, int extra) : Base(value), extraValue(extra) {}
private:
int extraValue;
};
Langue C