Domanda

dire Let ho questo programma:

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

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

(Naturalmente questo esempio non ha senso dato che avevo, ovviamente, dichiaro "contro" come attributo privato, ma è solo per illustrare il problema).

Mi piacerebbe sapere come C ++ si comporta in questo tipo di situazione:? Sarà la variabile "contatore" nel metodo bar () essere lo stesso per ogni istanza

È stato utile?

Soluzione

Sì, counter sarà condiviso tra tutte le istanze di oggetti di tipo Foo nel vostro eseguibile. Finché sei in un ambiente singlethreaded, funzionerà come previsto come un contatore in comune.

In un ambiente multithreading, avrete condizioni di gara interessanti debug:.)

Altri suggerimenti

Con il termine "essere lo stesso per ogni istanza" si intende non ci sarà un esempio di questa variabile condivisa su ogni istanza di classe, allora sì, questo è corretto. Tutte le istanze della classe utilizzeranno la stessa istanza variabile.

Ma tenere a mente che con le variabili di classe si deve prendere le cose come il multi-threading in considerazione, in molti casi, che è tutto un argomento diverso.

Da Il C ++ Programming Language (2 ° edizione) , pagina 200, da Bjarne Stroustrup:

  

Non utilizzare static , ad eccezione all'interno funzioni [semplici] (§7.1.2) e classi (§10.2.4).

Il tuo esempio è stato un paio di linee a partire da essere qualcosa che si potrebbe compilare e di test:

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

Gli sguardi di uscita come questo:

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

Quindi sì, il contatore viene condiviso tra tutte le istanze.

Hai solo bisogno di capire due cose:

    variabili
  1. statici sono memorizzati in un'area statica del programma in esecuzione (che è uguale a quello della variabile globale).
  2. Scope è limitato dalle regole generali di variabili statiche parentheses.Additionally avere collegamento interno.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top