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 ?

Pourquoi l'initialisation des membres de données statiques doit-elle avoir lieu en dehors de la définition de classe ?

Linda Hamilton
Libérer: 2024-11-05 19:57:02
original
439 Les gens l'ont consulté

Why Must Static Data Member Initialization Happen Outside the Class Definition?

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

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!

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