2010-09-23 2 views
4

Je veux savoir si j'ai une variable statique dans une fonction membre de classe si cette variable aura seulement une instance pour cette classe ou pour chaque objet de cette classe. Voici un exemple de ce que je veux faire.Est-ce une variable statique locale par instance ou par classe?

class CTest 
{ 
public: 
    testFunc(); 

}; 

CTest::testFunc() 
{ 
    static list<string> listStatic; 
} 

Est-ce que listStatic est utilisé par instance ou par classe?

+2

Remarque évidente: une variable statique est, à toutes fins utiles, une variable globale, avec tous les problèmes qu'elle engendre, parmi lesquels: pas de réentrée possible (test plus difficile), obligation de sérialiser les accès en code multithread (goulot d'étranglement des performances), ... Essayez de ne pas utiliser de variables globales (et donc de singletons) autant que possible. –

Répondre

9

Il s'agit de la fonction CTest::testFunc() - chaque invocation de cette fonction membre utilisera la même variable.

+2

Cela est également vrai pour les variables statiques dans les fonctions déclarées en dehors d'une portée de classe (fonctions autonomes). Il est également vrai qu'il n'y a qu'une seule instance de la variable par classe, mais seulement parce que la fonction appartient à la classe. La variable n'est initialisée qu'une seule fois, au moment de l'appel de la fonction, permettant un certain contrôle sur les dépendances d'initialisation. – gregg

2

Is est "par classe", car il est statique par rapport à la méthode actuelle et il n'y a qu'un seul endroit où cette méthode est, c'est-à-dire dans la classe.

5

Quelque chose à votre esprit d'ébullition:

template <typename T> 
struct Question 
{ 
    int& GetCounter() { static int M; return M; } 
}; 

Et dans ce cas, combien de compteurs?
.
.
.
.
La réponse est: comme beaucoup de différents T pour lesquels Question est instancié avec, qui est un template est pas une classe elle-même, mais Question<int> est une classe, différente de Question<double> donc chacun d'eux a un compteur différent. Fondamentalement, comme cela a été dit, une statique locale est propre à une fonction/méthode. Il y en a une pour la méthode, et deux méthodes différentes auront deux statiques locales différentes (si elles en ont).

struct Other 
{ 
    int& Foo() { static int M; return M; } 
    int& Bar() { static int M; return M; } 
}; 

Ici, il y a 2 compteurs (au total): l'une est Other::Foo()::M et l'autre est Other::Bar()::M (noms pour plus de commodité seulement).

Le fait qu'il ya une classe est accessoire:

namespace Wazza 
{ 
    int& Foo() { static int M; return M; } 
    int& Bar() { static int M; return M; } 
} 

Deux autres compteurs: Wazza::Foo()::M et Wazza::Bar()::M.

Questions connexes