Frage

Nehmen wir an, ich habe dieses Programm:

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

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

(Natürlich macht dieses Beispiel keinen Sinn, da ich offensichtlich "Zähler" als privates Attribut deklarieren würde, aber es ist nur um das Problem zu veranschaulichen).

Ich möchte wissen, wie sich C ++ in dieser Situation verhält: Wird der Variable "Zähler" in der bar () -Methode für jede Instanz gleich sein?

War es hilfreich?

Lösung

Ja, counter wird über alle Fälle von Objekten vom Typ geteilt Foo in Ihrer ausführbaren Datei. Solange Sie sich in einer Single -Umgebung befinden, wird es wie ein gemeinsamer Zähler erwartet.

In einer Multithread -Umgebung haben Sie interessante Rennbedingungen für das Debuggen :).

Andere Tipps

Mit "Sei für jeden Fall", meinst du, es wird eine Instanz dieser Variablen geben, die in jeder Klasseninstanz geteilt wird, ja, das ist richtig. Alle Instanzen der Klasse verwenden dieselbe Variableninstanz.

Denken Sie jedoch daran, dass Sie bei Klassenvariablen Dinge wie Multi-Threading in vielen Fällen berücksichtigen müssen, was ein ganz anderes Thema ist.

Aus Die C ++ - Programmiersprache (2. Auflage), Seite 200, von Bjarne Stroustrup:

Verwenden Sie nicht statisch außer in [einfachen] Funktionen (§7.1.2) und Klassen (§10.2.4).

Ihr Beispiel war ein paar Zeilen davon, etwas zu sein, das Sie zusammenstellen und testen konnten:

#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;
}

Die Ausgabe sieht so aus:

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

Also ja, der Zähler wird in allen Fällen in allen Fällen geteilt.

Sie müssen nur zwei Dinge erfassen:

  1. Statische Variablen werden im statischen Bereich des ausführenden Programms gespeichert (was dem der globalen Variablen entspricht).
  2. Umfang ist durch die allgemeinen Regeln von Klammern begrenzt.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top