Variables statiques en C++

Je voudrais savoir quelle est la différence entre les variables statiques dans un fichier d'en-tête vs déclarée dans une classe. Lorsque la variable statique est déclarée dans un fichier d'en-tête est sa portée limitée à .h fichier ou à travers toutes les unités. Aussi généralement variable statique est initialisée dans .fichier cpp lorsqu'il est déclaré dans un droit de classe? Cela signifie donc que la portée de la variable statique est limitée à 2 unités de compilation?

50
demandé sur peSHIr 2010-09-13 09:43:24

3 réponses

Excusez-moi quand je réponds à vos questions hors de l'ordre, il est plus facile de comprendre de cette façon.

Lorsque la variable statique est déclarée dans un fichier d'en-tête, sa portée est limitée à .h fichier ou à travers toutes les unités.

Il n'existe pas de "portée de fichier d'en-tête". Le fichier d'en-tête obtient inclus dans les fichiers source. L'Unité de traduction est le fichier source y compris {[16] } le texte des fichiers d'en-tête. Tout ce que vous écrivez dans un fichier d'en-tête obtient copié dans chaque fichier source inclus.

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.

Comme la déclaration d'une variable static signifie une liaison interne, chaque unité de traduction #include dans votre fichier d'en-tête obtient son propre, variable individuelle (qui n'est pas visible en dehors de votre unité de traduction). Ce n'est généralement pas ce que vous voulez.

Je voudrais savoir ce qui est la différence entre les variables statiques dans un fichier d'en-tête vs déclaré 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 pouvez avoir des centaines d'objets de ce type, mais chaque fois qu'un de ces objets fait référence à la variable static (ou "classe"), c'est la même valeur pour tous les objets. Vous pourriez le considérer comme une "classe mondiale".

Généralement, la variable statique est initialisée .fichier cpp lorsqu'il est déclaré dans un droit de classe ?

Oui, Un (et seulementUn ) Unité de traduction doit initialiser la variable de classe.

Cela signifie donc que la portée de la variable statique est limitée à 2 unités de compilation ?

Comme je l'ai dit:

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

Global static limite la portée à l'Unité de traduction. Classe static signifie global à toutes les instances.

J'espère que cela aide.

PS: vérifiez le dernier paragraphe de la réponse de Chubsdad, sur la façon dont vous ne devriez pas utiliser static en C++ pour indiquer un lien interne, mais des espaces de noms anonymes. (Parce qu'il est droit. ;-) )

74
répondu DevSolar 2010-09-13 07:32:56

Variable Statique dans un fichier d'en-tête:

Dites 'common.h' a

static int zzz;

Cette variable 'zzz' a une liaison interne (cette même variable n'est pas accessible dans d'autres unités de traduction). Chaque unité de traduction qui comprend 'common.h' a son propre objet unique de nom 'zzz'.

Variable Statique dans une classe:

La variable statique d'une classe ne fait pas partie du sous-objet de la classe. Il n'y a qu'une seule copie d'un membre de données statique partagée par tous les objets de la classe.

$9.4.2/6 - "membres de données statiques d'un classe dans l'espace de noms portée externe de liaison (3.5).Une classe locale ne doit pas avoir des membres de données statiques."

Disons donc que '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 traductions unité.

Note: utilisation de 'static' pour déclarer la variable de portée de fichier est obsolète et Unnamed namespace est un supérieur alterner

44
répondu Chubsdad 2013-04-30 07:08:04

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

Une variable de classe statique d'autre part est 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 la variable statique.

14
répondu Goutham 2010-09-13 06:14:49