Statyczne elementy członkowskie (C++)

Klasy mogą zawierać statyczne dane składowe i funkcje składowe. Gdy element członkowski danych jest zadeklarowany jako static, tylko jedna kopia danych jest przechowywana dla wszystkich obiektów klasy.

Statyczne składowe danych nie są częścią obiektów danego typu klasy. W związku z tym deklaracja elementu członkowskiego danych statycznych nie jest uznawana za definicję. Składowa danych jest zadeklarowana w zakresie klasy, ale definicja jest wykonywana w zakresie pliku. Te statyczne elementy członkowskie mają powiązania zewnętrzne. Zostało to przedstawione w poniższym przykładzie:

// static_data_members.cpp
class BufferedOutput
{
public:
   // Return number of bytes written by any object of this class.
   short BytesWritten()
   {
      return bytecount;
   }

   // Reset the counter.
   static void ResetCount()
   {
      bytecount = 0;
   }

   // Static member declaration.
   static long bytecount;
};

// Define bytecount in file scope.
long BufferedOutput::bytecount;

int main()
{
}

W poprzednim kodzie element członkowski bytecount jest zadeklarowany w klasie BufferedOutput, ale musi być zdefiniowany poza deklaracją klasy.

Statyczne składowe danych można odwoływać się bez odwoływania się do obiektu typu klasy. Liczbę bajtów zapisywanych przy użyciu BufferedOutput obiektów można uzyskać w następujący sposób:

long nBytes = BufferedOutput::bytecount;

Aby statyczny element członkowski istniał, nie jest konieczne, aby istnieją żadne obiekty typu klasy. Dostęp do statycznych elementów członkowskich można również uzyskać przy użyciu operatorów zaznaczenia składowego (i ->). Przykład:

BufferedOutput Console;

long nBytes = Console.bytecount;

W poprzednim przypadku odwołanie do obiektu (Console) nie jest obliczane; zwracana wartość to odwołanie do obiektu bytecountstatycznego .

Statyczne składowe danych podlegają regułom dostępu do składowych klasy, więc prywatny dostęp do statycznych składowych danych jest dozwolony tylko dla funkcji składowych klasy i znajomych. Te reguły opisano w temacie Kontrola dostępu do składowych. Wyjątkiem jest to, że statyczne elementy członkowskie danych muszą być zdefiniowane w zakresie plików niezależnie od ograniczeń dostępu. Jeśli element członkowski danych ma być jawnie zainicjowany, należy podać inicjator z definicją.

Typ statycznego elementu członkowskiego nie jest kwalifikowany przez jego nazwę klasy. W związku z tym typ to BufferedOutput::bytecountlong.

Zobacz też

Klasy i struktury