Sdílet prostřednictvím


Přehled členů třídy

A class nebo struct se skládá z jejích členů. Práce, kterou třída provádí, provádí její členské funkce. Stav, který udržuje, je uložený ve svých datových členech. Inicializace členů se provádí konstruktory a vyčištění práce, jako je uvolnění paměti a uvolnění prostředků, provádí destruktory. V jazyce C++11 a novějších můžou být datové členy (a obvykle by se měly) inicializovat v okamžiku deklarace.

Typy členů třídy

Úplný seznam kategorií členů je následující:

Ukázková deklarace třídy

Následující příklad ukazuje jednoduchou deklaraci třídy:

// TestRun.h

class TestRun
{
    // Start member list.

    // The class interface accessible to all callers.
public:
    // Use compiler-generated default constructor:
    TestRun() = default;
    // Don't generate a copy constructor:
    TestRun(const TestRun&) = delete;
    TestRun(std::string name);
    void DoSomething();
    int Calculate(int a, double d);
    virtual ~TestRun();
    enum class State { Active, Suspended };

    // Accessible to this class and derived classes only.
protected:
    virtual void Initialize();
    virtual void Suspend();
    State GetState();

    // Accessible to this class only.
private:
    // Default brace-initialization of instance members:
    State _state{ State::Suspended };
    std::string _testName{ "" };
    int _index{ 0 };

    // Non-const static member:
    static int _instances;
    // End member list.
};

// Define and initialize static member.
int TestRun::_instances{ 0 };

Přístupnost členů

Členy třídy jsou deklarovány v seznamu členů. Seznam členů třídy může být rozdělen do libovolného počtu privateprotected částí a public pomocí klíčových slov známých jako specifikátory přístupu. Dvojtečka : musí dodržovat specifikátor přístupu. Tyto části nemusí být souvislé; to znamená, že některá z těchto klíčových slov se může v seznamu členů objevit několikrát. Klíčové slovo určuje přístup všech členů, dokud se neobjeví další specifikátor přístupu nebo uzavírací složená závorka. Další informace naleznete v tématu Řízení přístupu člena (C++).

Statické členy

Datový člen může být deklarován jako statický, což znamená, že všechny objekty třídy mají přístup ke stejné kopii třídy. Členová funkce může být deklarována jako statická, v takovém případě může přistupovat pouze ke statickým datovým členům třídy (a nemá žádný this ukazatel). Další informace naleznete v tématu Statické datové členy.

Zvláštní členské funkce

Speciální členské funkce jsou funkce, které kompilátor poskytuje automaticky, pokud je nezadáte ve zdrojovém kódu.

  • Výchozí konstruktor

  • Kopírovací konstruktor

  • (C++11) Konstruktor move

  • Operátor pro kopírování přiřazení

  • (C++11) Operátor přesunutí přiřazení

  • Destruktor

Další informace naleznete v tématu Speciální členské funkce.

Inicializace podle člena

V jazyce C++11 a novější můžou deklarátory nestatického členu obsahovat inicializátory.

class CanInit
{
public:
    long num {7};       // OK in C++11
    int k = 9;          // OK in C++11
    static int i = 9; // Error: must be defined and initialized
                      // outside of class declaration.

    // initializes num to 7 and k to 9
    CanInit(){}

    // overwrites original initialized value of num:
    CanInit(int val) : num(val) {}
};
int main()
{
}

Pokud je člen přiřazena hodnota v konstruktoru, tato hodnota přepíše hodnotu přiřazenou k deklaraci.

Pro všechny objekty daného typu třídy existuje jenom jedna sdílená kopie statických datových členů. Statické datové členy musejí být definovány a mohou být inicializovány v rozsahu souboru. Další informace o statických datových členech naleznete v tématu Statické datové členy. Následující příklad ukazuje, jak inicializovat statické datové členy:

// class_members2.cpp
class CanInit2
{
public:
    CanInit2() {} // Initializes num to 7 when new objects of type
                 //  CanInit are created.
    long     num {7};
    static int i;
    static int j;
};

// At file scope:

// i is defined at file scope and initialized to 15.
// The initializer is evaluated in the scope of CanInit.
int CanInit2::i = 15;

// The right side of the initializer is in the scope
// of the object being initialized
int CanInit2::j = i;

Poznámka

Název třídy CanInit2 musí předcházet identifikátor i, čímž určíte, že definovaný identifikátor i je členem třídy CanInit2.

Viz také

Třídy a struktury