Обзор членов класса
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
и protected
public
разделы с помощью ключевое слово, известных как описатели доступа. Двоеточие :
должно соответствовать описателям доступа. Эти разделы не должны быть смежными; То есть любой из этих ключевое слово может отображаться несколько раз в списке членов. Ключевое слово назначает доступ всех членов до следующего описателя доступа или закрывающей фигурной скобки. Дополнительные сведения см. в разделе "Управление доступом к членам" (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
.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по