Udostępnij za pośrednictwem


Static (C++)

Słowo kluczowe static może być zastosowane, aby deklarować zmienne, funkcje, elementy członkowskie klas danych i funkcje klas.

Domyślnie obiekt lub zmienna, która jest zdefiniowana poza wszystkimi bloki ma statyczny czas trwania i powiązanie zewnętrzne.Statyczne czasy trwania oznaczają, że obiekt lub zmienna jest przydzielana przy starcie programu i jest zwalniana, gdy program się kończy.Łącza zewnętrzne oznaczają, że nazwa zmiennej jest widoczna poza plikiem, w którym ta zmienna została zgłoszona.Przeciwnie, wewnętrzne łączenie oznacza, że nazwa zmiennej nie jest widoczna poza plikiem, w którym ta zmienna została zgłoszona.

Słowo kluczowe static może być zastosowane w poniższych sytuacjach.

  • Kiedy deklarujesz zmienną lub funkcję w zakresie plików (zakres globalny lub przestrzeni nazwy), słowo kluczowe static określa, że zmienna lub funkcja posiada wewnętrzne łączenie.Kiedy deklarujesz zmienną, zmienna posiada stały czas trwania i kompilator inicjalizuje ją na 0, chyba że określisz inną wartość.

  • Kiedy deklarujesz zmienną w funkcji, słowo kluczowe static określa, że zmienna zachowuje stan między wywołaniami tej funkcji.

  • Kiedy deklarujesz element członkowski danych w deklaracji klasy, słowo kluczowe static określa, że jedna kopia elementu członkowskiego jest udostępniania przez wszystkie wystąpienia klasy.Element członkowski danych statycznych musi być zdefiniowany w zakresie pliku.Element członkowski typu całkowitego, który został zadeklarowany jako conststatic może mieć inicjator.

  • Kiedy deklarujesz element członkowski funkcji w deklaracji klasy, słowo kluczowe static określa, że funkcja jest udostępniania przez wszystkie wystąpienia klasy.Funkcja statyczna elementu członkowskiego nie ma dostępu do członka wystąpienia, ponieważ funkcja nie ma ukrytego this wskaźnika.Aby uzyskać dostęp do elementu członkowskiego wystąpienia, zadeklaruj funkcję z parametrem, który jest wskaźnikiem wystąpienia lub odwołania.

  • Elementy członkowskie nie mogą zostać zadeklarowane jako statyczne.Jednak globalnie zadeklarowane związki anonimowe muszą być jawnie zadeklarowane jako static.

Aby uzyskać więcej informacji, zobacz auto, extern i register.

Przykład

W poniższym przykładzie pokazano, jak zmienna zadeklarowana static w funkcji zachowuje swój stan między wywołaniami tej funkcji.

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}
  

Poniższy przykład pokazuje użycie klasy static.

// static2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class CMyClass {
public:
   static int m_i;
};

int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;

int main() {
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject1.m_i = 1;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject2.m_i = 2;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   CMyClass::m_i = 3;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;
}
  

W poniższym przykładzie ukazano zmienną lokalną zadeklarowaną static w funkcji członka.Zmienna statyczna jest dostępna dla całego programu; wszystkie przypadki tego rodzaju mają wspólną kopię zmiennej statycznej.

[!UWAGA]

Przypisywanie wartości do zmiennej lokalnej statycznej w wielowątkowych aplikacji nie jest bezpieczne dla wątków i firma Microsoft nie zaleca tej praktyki programistycznej.

// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
   void Test(int value) {
      static int var = 0;
      if (var == value) 
         cout << "var == value" << endl;
      else
         cout << "var != value" << endl;

      var = value;
   }
}; 

int main() {
   C c1;
   C c2;
   c1.Test(100);
   c2.Test(100);
}
  

Zobacz też

Informacje

Słowa kluczowe języka C++

Klasy magazynu w języku C++

Specyfikatory statycznych klas magazynowania

Statyczne funkcje członkowskie

Kontrola dostępu i statyczne składniki