Variables statiques en C ++

Je voudrais savoir quelle est la différence entre les variables statiques dans un fichier d’en-tête et celles déclarées dans une classe. Lorsque la variable statique est déclarée dans un fichier d’en-tête, son étendue est limitée au fichier .h ou à toutes les unités. Aussi généralement la variable statique est initialisée dans le fichier .cpp lorsqu’elle est déclarée dans une classe à droite? Cela signifie-t-il que la scope de la variable statique est limitée à 2 unités de compilation?

Excusez-moi quand je réponds à vos questions, cela facilite la compréhension.

Lorsque la variable statique est déclarée dans un fichier d’en-tête, son étendue est limitée au fichier .h ou à toutes les unités.

Il n’existe pas de “champ d’en-tête”. Le fichier d’en-tête est inclus dans les fichiers source. L’unité de traduction est le fichier source incluant le texte des fichiers d’en-tête. Tout ce que vous écrivez dans un fichier d’en-tête est copié dans chaque fichier source.

En tant que telle, une variable statique déclarée dans un fichier d’en-tête est comme une variable statique dans chaque fichier source individuel.

Étant donné que déclarer une variable de cette manière signifie une liaison interne, chaque unité de traduction #include votre fichier d’en-tête reçoit sa propre variable individuelle (qui n’est pas visible à l’extérieur de votre unité de traduction). Ce n’est généralement pas ce que vous voulez.

Je voudrais savoir quelle est la différence entre les variables statiques dans un fichier d’en-tête et celles déclarées dans une classe.

Dans une déclaration de classe, static signifie que toutes les instances de la classe partagent cette variable membre; c’est-à-dire que vous pourriez avoir des centaines d’objects de ce type, mais chaque fois qu’un de ces objects fait référence à la variable static (ou “class”), c’est la même valeur pour tous les objects. Vous pourriez le considérer comme une “classe globale”.

Aussi généralement la variable statique est initialisée dans le fichier .cpp lorsqu’elle est déclarée dans une classe à droite?

Oui, une (et une seule) unité de traduction doit initialiser la variable de classe.

Cela signifie-t-il que la scope de la variable statique est limitée à 2 unités de compilation?

Comme j’ai dit:

  • Un en-tête n’est pas une unité de compilation,
  • static signifie des choses complètement différentes selon le contexte.

Limites globales static scope à l’unité de traduction. Classe static signifie global à toutes les instances.

J’espère que ça aide.

PS: Vérifiez le dernier paragraphe de la réponse de Chubsdad, sur la manière dont vous ne devriez pas utiliser static en C ++ pour indiquer les liens internes, mais sur les espaces de noms anonymes. (Parce qu’il a raison. ;-))

Variable statique dans un fichier d’en-tête:

dis 'common.h' a

 static int zzz; 

Cette variable 'zzz' a un lien interne (cette même variable n’est pas accessible dans les autres unités de traduction). Chaque unité de traduction qui inclut 'common.h' a son propre object unique de nom 'zzz' .

Variable statique dans une classe:

La variable statique d’une classe ne fait pas partie du sous-object de la classe. Il existe une seule copie d’un membre de données statique partagé par tous les objects de la classe.

$ 9.4.2 / 6 – “Les membres de données statiques d’une classe dans la scope de l’espace de nommage ont un lien externe (3.5). Une classe locale ne doit pas avoir de membres de données statiques.”

Alors disons 'myclass.h' a

 struct myclass{ static int zzz; // this is only a declaration }; 

et myclass.cpp a

 #include "myclass.h" int myclass::zzz = 0 // this is a definition, // should be done once and only once 

et "hisclass.cpp" a

 #include "myclass.h" void f(){myclass::zzz = 2;} // myclass::zzz is always the same in any // translation unit 

et "ourclass.cpp" a

 #include "myclass.h" void g(){myclass::zzz = 2;} // myclass::zzz is always the same in any // translation unit 

Ainsi, les membres statiques de classe ne sont pas limités à seulement 2 unités de traduction. Ils ne doivent être définis qu’une seule fois dans l’une des unités de traduction.

Remarque: l’utilisation de ‘static’ pour déclarer une variable de scope de fichier est obsolète et un espace de nom sans nom est une alternative supérieure

Une variable statique déclarée dans un fichier d’en-tête en dehors de la classe serait file-scoped sur chaque fichier .c contenant l’en-tête. Cela signifie qu’une copie séparée d’une variable portant le même nom est accessible dans chacun des fichiers .c où vous incluez le fichier d’en-tête.

Une variable de classe statique, par contre, a une scope de class-scoped et la même variable statique est disponible pour chaque unité de compilation qui inclut l’en-tête contenant la classe avec une variable statique.