Share via


Statické členy (C++)

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

Statické datové členy nejsou součástí objektů daného typu třídy. V důsledku toho se deklarace statického datového členu nepovažuje za definici. Datový člen je deklarován v oboru třídy, ale definice se provádí v oboru souboru. Tito statická členové mají externí propojení. Ilustruje to 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 ve třídě BufferedOutput, ale musí být definován mimo deklaraci třídy.

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

long nBytes = BufferedOutput::bytecount;

Aby statický člen existoval, není nutné, aby existovaly žádné objekty typu třídy. Ke statickým členům lze přistupovat také pomocí operátorů výběru členů (. a ->). Příklad:

BufferedOutput Console;

long nBytes = Console.bytecount;

V předchozím případě není vyhodnocen odkaz na objekt (Console) ; vrácená hodnota je hodnota statického objektu bytecount.

Statické datové členy podléhají pravidlům přístupu členů třídy, takže soukromý přístup ke statickým datovým členům je povolený jenom pro funkce členů třídy a přátele. Tato pravidla jsou popsána v řízení přístupu člena. Výjimkou je, že statické datové členy musí být definovány v oboru souborů bez ohledu na jejich omezení přístupu. Pokud má být datový člen explicitně inicializován, musí být s definicí uveden inicializátor.

Typ statického členu není kvalifikovaný názvem třídy. Proto je typ BufferedOutput::bytecountlong.

Viz také

Třídy a struktury