web-dev-qa-db-fra.com

Pourquoi les membres const doivent-ils être initialisés dans l'initialiseur du constructeur plutôt que dans son corps?

Pourquoi les membres de classe déclarés comme const doivent-ils être initialisés dans la liste d'initialisation du constructeur plutôt que dans le corps du constructeur?

Quelle est la différence entre les deux?

64
mahesh

En C++, un objet est considéré comme complètement initialisé lorsque l'exécution entre dans le corps du constructeur.

Tu as dit:

"Je voulais savoir pourquoi const doit être initialisé dans la liste d'initialisation du constructeur plutôt que dans son corps?."

Ce qui vous manque, c'est que initialisation se produit dans la liste d'initialisation, et affectation se produit dans le corps du constructeur. Les étapes de la logique:

1) Un objet const peut uniquement être initialisé.

2) Un objet a tous ses membres initialisés dans la liste d'initialisation. Même si vous ne les initialisez pas explicitement, le compilateur le fera volontiers pour vous :-)

3) Par conséquent, en combinant 1) et 2), un membre const ne peut avoir qu'une valeur qui lui est affectée lors de l'initialisation, ce qui se produit pendant la liste d'initialisation.

95
Vladimir

const et les variables de référence doivent être initialisées sur la ligne où elles sont déclarées.

 class Something  
 {  
     private:  
      const int m_nValue;  
     public:  
      Something()  
      {  
          m_nValue = 5;  
      }  
  };

produirait un code équivalent à;

const int nValue; // error, const vars must be assigned values immediately  
nValue = 5; 

L'affectation de valeurs de variables de membre const ou reference dans le corps du constructeur n'est pas suffisante.

C++ fournit un autre moyen d'initialiser les variables membres qui permet d'initialiser les variables membres lors de leur création plutôt qu'après. Cela se fait grâce à l'utilisation d'une liste d'initialisation.

Vous pouvez attribuer des valeurs aux variables de deux manières: de manière explicite et implicite: afficher la plainopie sur le presse-papiers?

int nValue = 5; // explicit assignment  
double dValue(4.7); // implicit assignment  

L'utilisation d'une liste d'initialisation est très similaire à l'exécution d'affectations implicites.

N'oubliez pas que la liste d'initialisation des membres, utilisée pour initialiser les objets de données de base et de membre, se trouve dans la définition et non dans la déclaration du constructeur.

En savoir plus sur cpp-tutorial et Code Wrangler .

9
VonC