Disons que je crée:Risque de partage de variable statique locale d'une méthode entre instances?
class Hello {
public:
int World(int in)
{
static int var = 0; // <<<< This thing here.
if(in >= 0) {
var = in;
} else {
cout << var << endl;
}
}
};
Maintenant, si je fais:
Hello A;
Hello B;
A.World(10);
A.World(-1);
B.World(-1);
Je reçois la sortie de "10" suivie d'une autre "10". La valeur de la variable locale d'une méthode vient de passer d'une instance d'une classe à une autre.
Ce n'est pas surprenant - techniquement, les méthodes ne sont que des fonctions avec un paramètre caché this
, donc une variable locale statique devrait se comporter comme dans les fonctions communes. Mais est-ce garanti? Est-ce un comportement imposé par la norme, ou est-ce simplement un sous-produit heureux de la façon dont le compilateur gère les méthodes? En d'autres termes, ce comportement est-il sûr à utiliser? (... au-delà du risque standard de dérouter quelqu'un d'inhabituel ...)
Tout aussi important que la durée de stockage est le fait que le nom 'var' a maintenant * lien interne * (par opposition à" pas de liaison "), et donc toutes les instances du nom se réfèrent à la même entité. –
@KerrekSB, chose certaine. Ajouterai. – SergeyA