Quelqu'un peut-il expliquer comment les variables statiques dans les fonctions membres fonctionnent en C ++.
Compte tenu de la classe suivante:
class A {
void foo() {
static int i;
i++;
}
}
Si je déclare plusieurs instances de A
, l'appel foo()
d'une instance incrémente-t-il la variable statique i
sur toutes les instances? Ou seulement celui sur lequel il était appelé?
J'ai supposé que chaque instance aurait sa propre copie de i
, mais parcourir un certain code que j'ai semble indiquer le contraire.
static int i
spécifique à l'instance, de sorte que par exempleo1.foo(); // i = 1
et$o2.foo(); // i = 1
...?m_
pour indiquer l'état de i.Le mot-clé a
static
malheureusement quelques significations différentes et indépendantes en C ++Lorsqu'il est utilisé pour les membres de données, cela signifie que les données sont allouées dans la classe et non dans les instances.
Lorsqu'elles sont utilisées pour des données à l'intérieur d'une fonction, cela signifie que les données sont allouées de manière statique, initialisées la première fois que le bloc est entré et dure jusqu'à ce que le programme se ferme. De plus, la variable n'est visible qu'à l'intérieur de la fonction. Cette particularité de la statique locale est souvent utilisée pour implémenter la construction paresseuse de singletons.
Lorsqu'elle est utilisée au niveau d'unité de compilation (module), cela signifie que la variable est comme une variable globale (c'est-à-dire allouée et initialisée avant d'
main
être exécutée et détruite après lesmain
sorties) mais que la variable ne sera pas accessible ou visible dans d'autres unités de compilation .J'ai ajouté un peu d'emphase sur la partie la plus importante pour chaque utilisation. Use (3) est quelque peu déconseillé en faveur des espaces de noms sans nom qui permettent également des déclarations de classe non exportées.
Dans votre code, le
static
mot-clé 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 fonction et il n'y en aura qu'une copie.Comme l'a correctement dit iammilind , il aurait pu y avoir plusieurs instances de cette variable si la fonction était une fonction modèle (car dans ce cas, en effet, la fonction elle-même peut être présente dans de nombreuses copies différentes dans le programme). Même dans ce cas, bien sûr, les classes et les instances ne sont pas pertinentes ... voir l'exemple suivant:
la source
keyword static unfortunately has a few different unrelated meanings in C++
:)Variables statiques à l'intérieur des fonctions
La variable statique est créée à l'intérieur d'une fonction est stockée dans la mémoire statique du programme et non sur la pile.
L'initialisation de la variable statique sera effectuée au premier appel de la fonction.
La variable statique conservera la valeur dans plusieurs appels de fonction
La durée de vie de la variable statique est Program
Exemples
Production :
Variable statique
Valeur de la variable: 0
Valeur de la variable: 1
Valeur de la variable: 2
Valeur de la variable: 3
Valeur de la variable: 4
Variable automatique
Valeur de la variable: 0
Valeur de la variable: 0
Valeur de la variable: 0
Valeur de la variable: 0
Valeur de la variable: 0
la source
Réponse simplifiée:
Les variables statiques, qu'elles soient membres d'une fonction (non basée sur
class
un modèle) ou (sans modèle), se comportent - techniquement - comme une étiquette globale dont la portée est limitée à laclass
fonction ou.la source
MyClass& instance(){ static MyClass x("config.ini"); return x; }
- une implémentation portable valide pour une utilisation mono-thread exactement parce que la statique locale n'est PAS simplement comme un global malgré ce que vous dites.