Przegląd składowej klasy

Element class lub struct składa się z jego elementów członkowskich. Praca wykonywana przez klasę jest wykonywana przez jego funkcje składowe. Stan, który utrzymuje, jest przechowywany w jego elementach członkowskich danych. Inicjowanie elementów członkowskich odbywa się przez konstruktory, a oczyszczanie, takie jak zwalnianie pamięci i zwalnianie zasobów jest wykonywane przez destruktory. W języku C++11 i nowszych składowe danych mogą (i zwykle powinny) być inicjowane w punkcie deklaracji.

Rodzaje składowych klasy

Pełna lista kategorii elementów członkowskich jest następująca:

Przykładowa deklaracja klasy

W poniższym przykładzie przedstawiono prostą deklarację klasy:

// 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 };

Ułatwienia dostępu do składowych

Składowe klasy są deklarowane na liście składowej. Lista składowa klasy może być podzielona na dowolną liczbę privateprotected sekcji i public przy użyciu słów kluczowych znanych jako specyfikatory dostępu. Dwukropek : musi być zgodny ze specyfikatorem dostępu. Te sekcje nie muszą być ciągłe; oznacza to, że dowolne z tych słów kluczowych może pojawić się kilka razy na liście elementów członkowskich. Słowo kluczowe wyznacza dostęp do wszystkich elementów członkowskich aż do następnego specyfikatora dostępu lub nawiasu zamykającego. Aby uzyskać więcej informacji, zobacz Kontrola dostępu do składowych (C++).

Statyczne elementy członkowskie

Składowa danych może być zadeklarowana jako statyczna, co oznacza, że wszystkie obiekty klasy mają dostęp do tej samej kopii. Funkcja składowa może być zadeklarowana jako statyczna, w tym przypadku może ona uzyskiwać dostęp tylko do statycznych składowych danych klasy (i nie this ma wskaźnika). Aby uzyskać więcej informacji, zobacz Statyczne elementy członkowskie danych.

Specjalne funkcje składowe

Specjalne funkcje składowe to funkcje, które kompilator udostępnia automatycznie, jeśli nie określisz ich w kodzie źródłowym.

  • Konstruktor domyślny.

  • Konstruktor kopiujący

  • (C++11) Konstruktor przenoszenia

  • Operator przypisania kopiowania

  • (C++11) Operator przypisania przenoszenia

  • Destruktor

Aby uzyskać więcej informacji, zobacz Specjalne funkcje składowe.

Inicjowanie mądrej składowej

W języku C++11 lub nowszym deklaratory niestacjonalnych składowych mogą zawierać inicjatory.

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

Jeśli element członkowski ma przypisaną wartość w konstruktorze, ta wartość zastępuje wartość przypisaną przy deklaracji.

Istnieje tylko jedna współdzielona kopia składowych danych statycznych dla wszystkich obiektów danego typu klasy. Dane statyczne członków muszą być zdefiniowane i mogą być zainicjowane w zakresie pliku. Aby uzyskać więcej informacji o statycznych elementach członkowskich danych, zobacz Statyczne elementy członkowskie danych. W poniższym przykładzie pokazano, jak zainicjować składowe danych statycznych:

// 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;

Uwaga

Nazwa klasy CanInit2 musi znajdować się przed i, aby określić, że definiowany i jest składową klasy CanInit2.

Zobacz też

Klasy i struktury