Le mot-clé static
a malheureusement plusieurs significations différentes et non liées en C++.
-
Lorsqu'il est utilisé pour des membres de données, cela signifie que les données sont alloué dans la classe et non dans les instances.
-
Lorsqu'il est utilisé pour des données à l'intérieur d'une fonction, cela signifie que les données sont allouées de manière statique, initialisé la première fois que le bloc est entré et dure jusqu'à ce que le programme s'arrête. De plus, la variable n'est visible qu'à l'intérieur de la fonction. Cette caractéristique spéciale de la statique locale est souvent utilisée pour mettre en œuvre la construction paresseuse de singletons.
-
Lorsqu'elle est utilisée au niveau d'une unité de compilation (module), cela signifie que la variable est comme une variable globale (c'est-à-dire qu'elle est allouée et initialisée avant l'entrée en vigueur de la directive main
est exécuté et détruit après main
sort) mais que la variable ne sera pas accessible ou visible dans d'autres unités de compilation .
J'ai mis l'accent sur la partie qui est la plus importante pour chaque utilisation. L'utilisation (3) est quelque peu découragée en faveur d'espaces de noms sans nom qui permettent également des déclarations de classes non exportées.
Dans votre code, le static
est utilisé avec la signification numéro 2 et n'a rien à voir avec les classes ou les instances... c'est une variable de la classe fonction et il n'y aura qu'une seule copie de celui-ci.
Comme il se doit iammilind Cependant, il aurait pu y avoir plusieurs instances de cette variable si la fonction était une fonction modèle (car dans ce cas, la fonction elle-même peut être présente en plusieurs exemplaires différents dans le programme). Même dans ce cas, bien sûr, les classes et les instances ne sont pas pertinentes... voir l'exemple suivant :
#include <stdio.h>
template<int num>
void bar()
{
static int baz;
printf("bar<%i>::baz = %i\n", num, baz++);
}
int main()
{
bar<1>(); // Output will be 0
bar<2>(); // Output will be 0
bar<3>(); // Output will be 0
bar<1>(); // Output will be 1
bar<2>(); // Output will be 1
bar<3>(); // Output will be 1
bar<1>(); // Output will be 2
bar<2>(); // Output will be 2
bar<3>(); // Output will be 2
return 0;
}