Question

Disons que j'ai ce programme:

class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;
}

(Bien sûr, cet exemple n'a pas de sens puisque je déclare évidemment « contre » comme un attribut privé, mais il est juste pour illustrer le problème).

Je voudrais savoir comment C ++ se comporte dans ce genre de situation: sera la variable « compteur » dans la méthode bar () être la même pour tous les cas

?
Était-ce utile?

La solution

Oui, counter sera partagé entre toutes les instances d'objets de type Foo dans votre exécutable. Tant que vous êtes dans un environnement singlethreaded, cela fonctionnera comme prévu un compteur partagé.

Dans un environnement multithread, vous aurez des conditions de course intéressantes à debug.)

Autres conseils

Par « être la même pour tous les cas » vous voulez dire qu'il y aura une instance de cette variable partagée à travers chaque instance de classe, alors oui, c'est exact. Toutes les instances de la classe utiliseront la même variable d'instance.

Mais gardez à l'esprit que les variables de classe, vous devez prendre des choses comme le multi-threading en compte dans de nombreux cas, ce qui est un sujet tout à fait différent.

De Le C ++ Programming Language (2ème édition) , page 200, par Bjarne Stroustrup:

  

Ne pas utiliser statique sauf à l'intérieur [ordinaire] fonctions (§7.1.2) et les classes (§10.2.4).

Votre exemple a été quelques lignes loin d'être quelque chose que vous pouvez compiler et tester:

#include <iostream>
using namespace std;
class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;

    for (int i=0; i < 10; i++)
      cout<<i<<". "<<a.bar()<<" / "<<b.bar()<<endl;
}

La sortie ressemble à ceci:

0. 1 / 0
1. 3 / 2
2. 5 / 4
3. 7 / 6
4. 9 / 8
5. 11 / 10
6. 13 / 12
7. 15 / 14
8. 17 / 16
9. 19 / 18

Alors oui, le compteur est partagé entre toutes les instances.

Il vous suffit de saisir deux choses:

  1. Les variables statiques sont stockées dans la zone statique de l'exécution de programme (qui est la même que celle de la variable globale).
  2. Champ d'application est limité par les règles générales de variables statiques parentheses.Additionally ont une liaison interne.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top