Membres de données static (C++)
Les classes peuvent contenir des données statiques de membre et des fonctions membres statiques. Lorsqu'une donnée membre est déclarée comme statique, une seule copie des données est conservée pour tous les objets de la classe. (Pour plus d'informations, consultez la rubrique Fonction statique membre.)
Les membres statiques de données ne font pas partie des objets d'un type donné de classe ; ce sont des objets distincts. Par conséquent, la déclaration d'un membre statique de données n'est pas considérée comme une définition. Le membre de donné est déclaré dans la portée de classe, mais la définition est exécutée à la portée du fichier. Ces membres statiques ont une liaison externe. L'exemple suivant illustre ce comportement :
// static_data_members.cpp
class BufferedOutput
{
public:
// Return number of bytes written by any object of this class.
short BytesWritten()
{
return bytecount;
}
// Reset the counter.
static void ResetCount()
{
bytecount = 0;
}
// Static member declaration.
static long bytecount;
};
// Define bytecount in file scope.
long BufferedOutput::bytecount;
int main()
{
}
Dans le code précédent, le membre bytecount est déclaré dans la classe BufferedOutput, mais doit être définie en dehors de la déclaration de classe.
Les membres statiques de données peuvent être mentionnées sans faire référence à un objet de type classe. Le nombre d'octets écrits utilisant des objets BufferedOutput peut être obtenu comme suit :
long nBytes = BufferedOutput::bytecount;
Pour que le membre statique existe, il n'est pas nécessaire que tous les objets du type de classe existent. Les membres statiques sont également accessibles en utilisant les opérateurs de sélection de membre (. et –>). Par exemple :
BufferedOutput Console;
long nBytes = Console.bytecount;
Dans le cas précédent, la référence à l'objet (Console) n'est pas évaluée ; la valeur retournée est celle de l'objet statique bytecount.
Les membres de données statiques sont soumises à des règles d'accès de membre de classe, pour que l'accès privé aux membres statiques de données statiques soit autorisé uniquement pour les fonctions membres de classe et Friends. Ces règles sont décrites dans Contrôle de l'accès membre. L'exception est que les membres statiques de données doivent être définies dans la portée du fichier quelles que soient leurs restrictions d'accès. Si le membre de données doit être explicitement initialisé, un initialiseur doit être fourni avec la définition.
Le type d'un membre statique n'est pas qualifié par son nom de classe. Par conséquent, me type de BufferedOutput::bytecount est long.