Обзор членов класса

A class или struct состоит из его членов. Действия, выполняемые классом, выполняются с помощью его функций-членов. Состояние, в котором он находится, хранится в его элементах данных. Инициализация элементов выполняется конструкторами, а работа по очистке, например освобождение памяти и освобождение ресурсов, выполняется деструкторами. В C++ 11 и более поздних версиях элементы данных можно (и обычно следует) инициализировать при объявлении.

Виды членов класса

Ниже приведен полный список категорий членов.

Пример объявления класса

В следующем примере показано объявление простого класса.

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

Доступность членов

Члены класса объявляются в списке членов. Список членов класса может быть разделен на любое число privateи protectedpublic разделы с помощью ключевое слово, известных как описатели доступа. Двоеточие : должно соответствовать описателям доступа. Эти разделы не должны быть смежными; То есть любой из этих ключевое слово может отображаться несколько раз в списке членов. Ключевое слово назначает доступ всех членов до следующего описателя доступа или закрывающей фигурной скобки. Дополнительные сведения см. в разделе "Управление доступом к членам" (C++).

Статические участники

Элемент данных может быть объявлен как статический, что означает, что все объекты класса имеют доступ к одной и той же его копии. Функция-член может быть объявлена как статическая, в этом случае она может получить доступ только к статическим элементам данных класса (и не this имеет указателя). Дополнительные сведения см. в разделе "Статические элементы данных".

Специальные функции-члены

Специальные функции-члены — это функции, которые компилятор предоставляет автоматически, если они не указаны в исходном коде.

  • Конструктор по умолчанию.

  • Конструктор копии

  • (C++11) Конструктор перемещения

  • Оператор присваивания копированием

  • (C++11) Оператор перемещения назначения

  • Деструктор

Дополнительные сведения см. в разделе "Специальные функции-члены".

Инициализация элементов

В C++ 11 и более поздних версиях деклараторы нестатических членов могут содержать инициализаторы.

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

Если элемент назначается в конструкторе, это значение перезаписывает значение, назначенное при объявлении.

Существует только одна общая копия статических элементов данных для всех объектов заданного типа класса. Статические данные-члены необходимо определить и инициализировать в области файлов. Дополнительные сведения о статических элементах данных см. в разделе "Статические элементы данных". В следующем примере показано, как инициализировать статические элементы данных:

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

Примечание.

Имя класса, CanInit2, должно предшествовать i, чтобы указать, что i определяется как член класса CanInit2.

См. также

Классы и структуры