Domanda

Si tratta di un ampliamento del campo di applicazione di a la mia domanda precedente.

Cos'è esattamente "statico", come viene utilizzato e qual è lo scopo dell'utilizzo di "statico" quando si ha a che fare con C++?

Grazie.

È stato utile?

Soluzione

La parola chiave static ha significati diversi in C++, a seconda del contesto.

Quando si dichiara una funzione libera o una variabile globale significa che la funzione non deve essere disponibile al di fuori di questa singola unità di traduzione:

// test.cpp
static int a = 1;
static void foo() {}

Se il risultato della compilazione di quell'unità di traduzione è collegato a una diversa unità di traduzione contenente simboli a E foo non infrangerà la regola dell'unica definizione, come in questa particolare unità di traduzione a E foo Sono privato simboli.Questo utilizzo è stato reso obsoleto dagli spazi dei nomi senza nome.

// test2.cpp
namespace {
   static int a = 1;
   static void foo() {}
}

Quando si dichiara una variabile locale all'interno di una funzione significa che la durata della variabile si estenderà dalla prima chiamata alla funzione fino alla fine del programma, e non solo per la durata della chiamata:

int foo() {
   static int counter = 0;
   return ++counter;
}
int main() {
  for ( int i = 0; i < 10; ++i ) { 
     std::cout << foo() << std::endl;
  }
}

Nel codice precedente, counter viene inizializzato una volta quando foo viene chiamato per la prima volta, ma la variabile sopravviverà alla funzione e manterrà il valore tra le diverse chiamate di funzione.Il codice precedente stamperà "1 2 3 4...10".Se la variabile non è stata dichiarata static quindi l'output sarebbe "1 1 1...1".

Nell'ambito di una classe, static significa che il membro è un membro della classe e non di un'istanza particolare.Questo uso è equivalente all'uso nell'altra tua domanda:l'utilizzo di quel particolare membro non è legato ad alcun oggetto specifico.

struct test {
   int x;
   static int y;
};
int test::y;       // need to define it in one translation unit
int main() {
   // test::x = 5; // !error cannot access a non-static member variable
                   // without an instance
   test::y = 5;    // ok
   test t, other;
   t.x = 10;       // ok
   t.y = 15;       // ok, the standard allows calling a static member through
                   // an instance, but this is the same as test::y
}

In questo caso, il membro x è un attributo membro non statico e come tale esiste un diverso x per ogni istanza della classe.Nel programma di esempio t.x E other.x fare riferimento a numeri interi diversi.D'altra parte y È static e quindi esiste una singola istanza di test::y nel programma.Anche se lo standard permette di chiamare t.y E other.y entrambi gli usi si riferiscono alla stessa variabile.Lo stesso vale con i metodi dei membri.Se sono statici sono metodi a livello di classe e possono essere chiamati senza un'istanza, mentre se non sono statici vengono applicati a un'istanza concreta e il a.b O a->b è necessario utilizzare la sintassi.

Questo uso di static è simile all'uso della stessa parola chiave in Java, mentre le altre due non sono presenti in quel linguaggio.C'è un uso della parola chiave in Java che non è presente in C++, e cioè l'uso di inizializzatori di classe statici (un blocco di codice a livello di classe circondato da static { ... }).In Java quel blocco di codice verrà eseguito quando la classe viene caricata e solo una volta.L'inizializzazione delle variabili membro statiche in C++ deve essere eseguita nell'inizializzatore della definizione di variabile.

Altri suggerimenti

Ciò significa che la variabile è locale ad un'unità di traduzione (semplicemente, ad un singolo file sorgente), e non è accessibile dall'esterno esso. Questo uso della statica è infatti deprecato nella corrente C ++ standard - invece si suppone di utilizzare gli spazi dei nomi anonimi:

static int x = 0;    

dovrebbe essere:

namespace {
    int x = 0;    
}

Questa roba sembra essere abbastanza ben coperto qui .

Ma per parafrasare, ci sono 2 usi in C

  1. Prevenire l'uso di una variabile globale al di fuori della portata del file che lo definisce.
  2. Consenti variabili locali all'interno di una funzione per persistono attraversato invocazioni della funzione, come in

    int getNextId () {   int id static = 0;   ritornare id ++; }

eredita C ++ entrambi, e aggiunge due usi della propria.

  1. variabili membro statiche: Le variabili che sono "condivisi" attraversato tutte le istanze di una classe, e può anche essere accessi senza riferimento a un'istanza della classe. Shared sembra la parola sbagliata, ma in sostanza ho beleive che il risultato è che ogni riferimento a un membro statico riferimenti variabili nella stessa posizione di memoria.
  2. metodi statici:. Metodi che possono essere chiamati senza riferimento ad una specifica istanza della classe che la definisce

Static sostanzialmente significa che una variabile è legata alla durata del programma e non di qualsiasi funzione o istanza di classe. Quando si dovrebbe utilizzare? Non farlo. Qual è lo scopo? Debug dei dati, per lo più.

In generale, in C ++, se vi trovate utilizzando i dati statici, hai fatto male. Ci sono momenti in cui è appropriato, ma sono molto rari.

Quando statico viene utilizzato in una classe in C ++, significa più o meno la stessa cosa che si fa in Java. Per le variabili significa che un'un'istanza del variabile esiste per tutte le classi e per le funzioni, significa che la funzione non implicitamente accedere al puntatore this affatto.

In C e C ++ quando statico viene utilizzato per una variabile o funzione globale, allora significa che la variabile può fare riferimento solo nel file C ++ C corrente o. In altre parole, il compilatore non deve generare alcun simbolo di trasferimento per la variabile o funzione.

Quando statico viene utilizzato accanto ad una variabile in una funzione locale, significa che la variabile non andare fuori del campo di applicazione, ma manterrà il suo valore da funzione-chiamata alla funzione di chiamata. La variabile diventa effettivamente una variabile globale che si può accedere solo dalla funzione data.

i membri della classe statiche sono i dati e le funzioni che sono associati con la classe stessa, piuttosto che con gli oggetti della classe.

Nell'esempio seguente, classe Fred ha un x_ membro di dati statici e un y_ membro di dati esempio. C'è solo una copia di Fred :: x_ indipendentemente da come vengono creati numerosi oggetti Fred (compresi senza Fred oggetti), ma c'è una y_ per oggetto Fred. Così x_ si dice che sia associato alla classe e y_ si dice che sia associata con un singolo oggetto della classe. Analogamente classe Fred ha una funzione f membro static () e una funzione di membro di istanza g ().

class Fred {
    public:
        static void f() throw();                           <-- 1
        void g() throw();                                  <-- 2
    protected:
        static int x_;                                     <-- 3
        int y_;                                            <-- 4
};

(1) funzione di membro associato alla classe

(2) funzione membro associato a un singolo oggetto della classe

(3) membro di dati associato alla classe

(4) membro dati associato a un singolo oggetto della classe

Utilizzo:

Quando si desidera mantenere tratto dal numero di istanze di una classe creata si utilizza variabile statica. Ad esempio in un 'auto' classe ogni istanza auto può avere un numero di serie unico (_y in questo caso) e l'azienda può decidere di tenere traccia del numero di vetture prodotte (_x in questo caso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top