Maison >développement back-end >C++ >Pourquoi l'initialisation des membres de données statiques doit-elle avoir lieu en dehors de la définition de classe ?
Comprendre l'initialisation des membres de données statiques
Un aspect particulier de l'initialisation des membres de données statiques est son placement en dehors de la classe. Cela soulève des questions sur la raison pour laquelle cela est nécessaire et sur ce qu'implique la nature de la déclaration et de la définition d'un membre de données statique.
Raison de l'initialisation en dehors de la classe
Données statiques les membres, contrairement aux membres non statiques, existent indépendamment de toute instance spécifique d'une classe. Ils ont une adresse fixe en mémoire et leur durée de vie s'étend sur la totalité du programme. Pour garantir qu’il n’existe qu’une seule définition d’une donnée membre statique, sa définition doit être en dehors de la définition de classe. En effet, les définitions de classe sont généralement incluses dans les fichiers d'en-tête, qui peuvent être inclus dans plusieurs fichiers objets. Si la définition du membre de données statique était autorisée dans la classe, cela entraînerait plusieurs définitions de la même variable, provoquant une erreur de l'éditeur de liens.
Déclaration vs. Définition
Dans une définition de classe, on peut fournir un initialiseur pour une donnée membre statique. Cependant, il s'agit simplement d'une déclaration avec un initialiseur, pas d'une définition. Une définition en C nécessite l'allocation de mémoire avec une adresse spécifique. Étant donné que l'adresse d'une donnée membre statique dépend de son emplacement en mémoire et du fait qu'elle est partagée entre toutes les instances de la classe, sa définition doit avoir lieu en dehors de la classe.
Exemple
Considérez le code suivant :
<code class="cpp">class X { int normalValue = 5; // Non-static data member initialization static int i; }; int X::i = 0; // Definition of the static data member</code>
Ici, la déclaration du membre de données statique i est à l'intérieur de la définition de la classe, mais sa définition est en dehors de la classe. Ceci est nécessaire car cela garantit qu'il n'y a qu'une seule définition de i et qu'il a une adresse unique en mémoire.
Essentiellement, alors que NSDMI permet une initialisation plus facile des données membres statiques au sein de la classe, leurs définitions doivent doivent toujours être fournis séparément pour éviter plusieurs définitions dans le programme compilé. La déclaration et la définition des données membres statiques servent à des fins différentes, nécessitant leur placement en dehors de la classe pour une bonne gestion de la mémoire et la prévention des erreurs de liaison.
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!