Sdílet prostřednictvím


Členové statických dat (C++)

Třídy mohou obsahovat statická členská data a členské funkce.Pokud je datový člen deklarován jako static, je zachována pouze jedna kopie dat pro všechny objekty třídy. (Další informace naleznete v tématu Statické členské funkce.)

Statické datové členy nejsou součástí objektu třídy daného typu, ale jedná se o samostatné objekty.V důsledku toho není deklarace statického datového člena považována za definici.Datový člen je deklarován v rozsahu třídy, ale definice je prováděna v rozsahu souboru.Tyto statické členy mají externí propojení.Toto dokládá následující příklad:

// 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()
{
}

V předchozím kódu, je člen bytecount deklarován v třídě BufferedOutput, ale definován musí být mimo deklaraci třídy.

Na statické datové členy lze odkazovat bez odkazování na objekt typu třídy.Počet bajtů zapsaných pomocí objektů BufferedOutput lze získat následujícím způsobem:

long nBytes = BufferedOutput::bytecount;

Pro existenci statického členu není nutné, aby existoval jakýkoli objekt typu třídy.Ke statickém členům lze přistupovat pomocí operátorů výběru člena (. a –>).Příklad:

BufferedOutput Console;

long nBytes = Console.bytecount;

V předchozím případě není reference na objekt (Console) vyhodnocena a vrácená hodnota je statický objekt bytecount.

Na statické datové členy se vztahují pravidla přístupu k členům třídy, tedy soukromý přístup k statickým datovým členům je povolen pouze pro členské funkce a přátele třídy.Tato pravidla jsou popsána v Řízení přístupu k členům.Výjimkou je, že statická data členů musí být definována v rozsahu souboru, bez ohledu na jejich omezení přístupu.Pokud má být datový člen explicitně inicializován, musí mít inicializátor přístup k definici.

Typ statického člena není kvalifikován jeho názvem třídy.Proto je BufferedOutput::bytecount typu long.

Viz také

Referenční dokumentace

Třídy, struktury a spojení